TypeClasses Haskell и интерфейсы движения

Каковы общие черты и различия между TypeClasses Haskell и Интерфейсами Движения? Каковы относительные достоинства / недостатки двух подходов?

29
задан Jeremy Jose 5 June 2010 в 20:38
поделиться

5 ответов

  1. In Создание экземпляра класса типов haskell является явным (т.е. вы должны указать instance Foo Bar , чтобы Bar был экземпляром Foo), в то время как в go реализация интерфейса является неявной (т.е. когда вы определяете класс, который определяет правильные методы , он автоматически реализует соответствующий интерфейс без необходимости указывать что-то вроде реализации InterfaceName ).
  2. Интерфейс может описывать только методы, в которых экземпляром интерфейса является получатель. В классе типов тип создания экземпляра может появляться в любой позиции аргумента или возвращаемого типа функции (то есть вы можете сказать, что если Foo является экземпляром типа Bar, должна быть функция с именем baz, которая принимает Int и возвращает Foo - с интерфейсами этого не скажешь).
7
ответ дан 28 November 2019 в 01:43
поделиться

Похоже, что только внешне представляют собой интерфейсы 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, что означает, что на самом деле они вообще не очень похожи. Интерфейсы строго менее мощные - своего рода класс типов нулевого порядка.

24
ответ дан 28 November 2019 в 01:43
поделиться

Очень поверхностное сходство, интерфейсы Go больше похожи на структурную подтипизацию в OCaml.

5
ответ дан 28 November 2019 в 01:43
поделиться

Концепции C ++ (которые не вошли в C ++ 0x) похожи на классы типов Haskell. Были и «аксиомы», которых вообще нет в Haskell. Они позволяют формализовать такие вещи, как законы монад.

3
ответ дан 28 November 2019 в 01:43
поделиться

Я добавлю к прекрасному ответу Дона Стюарта, что одно из удивительных последствий классов типов Haskell состоит в том, что вы можете использовать логическое программирование во время компиляции для генерации произвольного количества экземпляров класса. (Система классов типов Haskell включает в себя то, что фактически является свободным от сокращений подмножеством Prolog, очень похожим на Datalog.) Эта система эффективно используется в библиотеке QuickCheck. Или, в качестве очень простого примера, вы можете увидеть, как определить версию логического дополнения ( не ), которая работает с предикатами произвольной арности . Я подозреваю, что эта способность была непреднамеренным следствием системы типов и классов, но она оказалась невероятно мощной.

В Го нет ничего подобного.

6
ответ дан 28 November 2019 в 01:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: