Подтвердить что ты не робот

Haskell TypeClasses и Go интерфейсы

Каковы сходства и различия между Haskell TypeClasses и Go Interfaces? Каковы относительные достоинства/недостатки двух подходов?

4b9b3361

Ответ 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. Были также "аксиомы", которых вообще нет в "Хаскелле". Они позволяют вам формализовать такие вещи, как законы монады.