Каковы сходства и различия между Haskell TypeClasses и Go Interfaces? Каковы относительные достоинства/недостатки двух подходов?
Haskell TypeClasses и Go интерфейсы
Ответ 1
Похоже, только поверхностно - это интерфейсы Go, такие как классы с одним параметром (классы конструкторов) в Haskell.
- Методы связаны с типом интерфейса
- Объекты (конкретные типы) могут иметь реализации этого интерфейса
Неясно, поддерживает ли Go какой-либо способ ограниченного полиморфизма через интерфейсы, что является основной целью классов типов. То есть, в Haskell, методы интерфейса могут использоваться для разных типов,
class I a where
put :: a -> IO ()
get :: IO a
instance I Int where
...
instance I Double where
....
Итак, мой вопрос заключается в том, поддерживает ли Go поддержку полиморфизма типов. Если нет, они вообще не похожи на классы классов. И они на самом деле не сравнимы.
Классы типа Haskell допускают мощное повторное использование кода через "generics" - более высокий сортный полиморфизм - хорошая ссылка для кросс-языковой поддержки для таких форм родовых программа - это статья.
Ad hoc или ограниченный полиморфизм через классы классов хорошо описанный здесь. Это основная цель классов типов в Haskell, а одна из них не адресована через интерфейсы Go, что означает, что они совсем не похожи друг на друга. Интерфейсы строго менее мощны - своего рода класс типа нулевого порядка.
Ответ 2
- В haskell экземпляре typeclass явно (т.е. вы должны сказать
instance Foo Bar
, что Bar является экземпляром Foo), тогда как в go реализация интерфейса является неявной (т.е. когда вы определяете класс, который определяет правильные методы, автоматически реализует соответствующий интерфейс без необходимости говорить что-то вродеimplement InterfaceName
). - Интерфейс может описывать только методы, в которых экземпляр интерфейса является получателем. В typeclass тип экземпляра может появляться в любой позиции аргумента или в виде возвращаемого значения функции (т.е. Вы можете сказать, что если Foo является экземпляром типа Bar, должна существовать функция с именем baz, которая принимает Int и возвращает Foo - вы не можете сказать это с интерфейсами).
Ответ 3
Я добавлю к Дону Стюарту отличный ответ, что один из удивительных классов классов типа Haskell заключается в том, что вы можете использовать логическое программирование во время компиляции для генерации произвольно многих экземпляров класса. (Система типа Haskell включает в себя то, что эффективно является безрежимным подмножеством Prolog, очень похоже на Datalog.) Эта система используется с большим успехом в библиотеке QuickCheck. Или для очень простого примера вы можете увидеть, как определить версию булевого дополнения (not
), которая работает с предикатами произвольной арности. Я подозреваю, что эта способность была непреднамеренным следствием системы типа-класса, но она оказалась невероятно мощной.
Go не имеет ничего подобного.
Ответ 4
Очень поверхностные сходства, интерфейсы Go больше похожи на структурную подтип в OCaml.
Ответ 5
Концепции С++ (которые не попадают в С++ 0x) похожи на классы типа Haskell. Были также "аксиомы", которых вообще нет в "Хаскелле". Они позволяют вам формализовать такие вещи, как законы монады.