2015-06-04 11 views
5

Zastanawiam się, czy istnieje sposób na emulację Haskella w typeclasses w Common Lisp.Typeclasses we wspólnym Lisp

Funkcje ogólne umożliwiają overloading i można definiować typy za pomocą deftype (które można zdefiniować na przykład przy użyciu listy do niektórych instancji).

Ale nie mogę dispatch na typ. Czy istnieje sposób utworzenia klasy podklasy (i podtypu) innej klasy po jej definicji (np. Uczynienie klasy cons podklasą klasy sequence, bez przedefiniowania cons)?

Dzięki.

+2

Stackoverflow najlepsze dla rzeczywistych problemów programowania rzeczywistego, nie tak dobre dla spekulacji, czy język programowania A mógłby obsługiwać funkcje języka programowania B ... –

+0

Wahałem się, aby opublikować tutaj, uważam, że to naprawdę kwestia nie tylko tego, ale także w jaki sposób można wprowadzić taką funkcję (co jest problemem programistycznym, nie?). W każdym razie, będę o tym pamiętać. –

+0

Chcę wiedzieć, czy Lisp może to zrobić. Nawet jeśli to, czy Lisp może być podobny do Haskella, nie ma znaczenia, to czy Lisp potrafi pisać typografie, jest uzasadnionym pytaniem. –

Odpowiedz

2

Klasy typów w Haskell służą do statycznego wyszukiwania implementacji dla "interfejsów" w postaci słowników (podobnie jak używane są vtables w C++, ale (prawie) w pełni statycznie, w przeciwieństwie do C++, który dynamicznie wysyła w czasie wykonywania). Jednak Common Lisp jest dynamicznie pisanym językiem, więc takie wyszukiwanie nie miałoby sensu. Można jednak zaimplementować własne wyszukiwanie implementacji (instancji) typu "type class" w środowisku wykonawczym - projekt niezbyt trudny do wyobrażenia w języku tak ekspresyjnym jak Common Lisp.

P.S. Python's Zope ma mechanizm adaptacji o bardzo podobnej charactetistyce, jeśli masz ochotę nawiązać do istniejącego rozwiązania w dynamicznym otoczeniu.

+0

Słowniki instancji Haskella nie są szczególnie statyczne niż vtables języka C++. Specjalizują się w czasie kompilacji, gdy tylko jest to możliwe, ale w przeciwnym razie są one przekazywane w czasie wykonywania. – dfeuer

+3

przekazywana w czasie wykonywania, ale nie ma dynamicznego wyszukiwania, ponieważ nie ma dynamicznego wysyłania, ponieważ nie ma polimorfizmu podtypu aka (typ) dziedziczenia - czy coś przeoczyłem? –

+1

Nie jestem pewien. Wygląda na to, że terminologia jest nieco rozmyta. W przypadku rekombinacji polimorficznej (nawet w Haskell 98) lub GADT (w prawdziwym Haskellu), określony typ może nie być poznawalny, a konkretna instancja może nie istnieć do końca. Czy to nie jest esencja dynamicznej wysyłki? – dfeuer

-1

Nie można modyfikować hierarchii klas w taki sposób, w jaki sobie to wyobrażasz, ale możesz osiągnąć ten sam efekt.

Załóżmy, że twoja definicja sequence polega na tym, że ma ona metodę dla funkcji sequence-length.

(defclass sequence ...) 
(defmethod sequence-length ((s sequence)) ...) 

Następnie można łatwo rozszerzyć swoją metodę sequence-length do wagoników:

(defmethod sequence-length ((s cons)) 
    (length s)) 

Czy to utworzyć nową klasę, która zawiera cons? Nie całkiem. Możesz wyrazić typ rzeczy, które mają metodę sequence-length, mówiąc: (or sequence cons), ale to naprawdę nie jest przydatne.