Каковы общие черты и различия между TypeClasses Haskell и Интерфейсами Движения? Каковы относительные достоинства / недостатки двух подходов?
instance Foo Bar
, чтобы Bar был экземпляром Foo), в то время как в go реализация интерфейса является неявной (т.е. когда вы определяете класс, который определяет правильные методы , он автоматически реализует соответствующий интерфейс без необходимости указывать что-то вроде реализации InterfaceName
). Похоже, что только внешне представляют собой интерфейсы Go, такие как классы типов с одним параметром (классы конструкторов) в Haskell.
Мне неясно, поддерживает ли Go каким-либо образом ограниченный полиморфизм через интерфейсы, что является основной целью типа классы. То есть в Haskell методы интерфейса могут использоваться для разных типов
class I a where
put :: a -> IO ()
get :: IO a
instance I Int where
...
instance I Double where
....
. Поэтому мой вопрос в том, поддерживает ли Go полиморфизм типов. В противном случае они совсем не похожи на классы типов. И они не совсем сопоставимы.
Классы типов Haskell допускают мощное повторное использование кода с помощью «обобщений» - высокодородного полиморфизма - хорошим справочником по межъязыковой поддержке таких форм обобщенных программ является эта статья .
Специальный или ограниченный полиморфизм через классы типов хорошо описан здесь . Это основная цель классов типов в Haskell, и одна из них не решается через интерфейсы Go, что означает, что на самом деле они вообще не очень похожи. Интерфейсы строго менее мощные - своего рода класс типов нулевого порядка.
Очень поверхностное сходство, интерфейсы Go больше похожи на структурную подтипизацию в OCaml.
Концепции C ++ (которые не вошли в C ++ 0x) похожи на классы типов Haskell. Были и «аксиомы», которых вообще нет в Haskell. Они позволяют формализовать такие вещи, как законы монад.
Я добавлю к прекрасному ответу Дона Стюарта, что одно из удивительных последствий классов типов Haskell состоит в том, что вы можете использовать логическое программирование во время компиляции для генерации произвольного количества экземпляров класса. (Система классов типов Haskell включает в себя то, что фактически является свободным от сокращений подмножеством Prolog, очень похожим на Datalog.) Эта система эффективно используется в библиотеке QuickCheck. Или, в качестве очень простого примера, вы можете увидеть, как определить версию логического дополнения ( не
), которая работает с предикатами произвольной арности . Я подозреваю, что эта способность была непреднамеренным следствием системы типов и классов, но она оказалась невероятно мощной.
В Го нет ничего подобного.