Типы классов Haskell и интерфейсы Go - PullRequest
29 голосов
/ 06 июня 2010

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

Ответы [ 5 ]

24 голосов
/ 06 июня 2010

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

7 голосов
/ 06 июня 2010
  1. В haskell экземпляр класса типов является явным (т.е. вы должны сказать instance Foo Bar, чтобы Bar был экземпляром Foo), тогда как в go реализация интерфейса неявна (т.е. когда вы определяете класс, определяющийметоды, он автоматически реализует соответствующий интерфейс без необходимости говорить что-то вроде implement InterfaceName).
  2. Интерфейс может описывать только методы, в которых экземпляр интерфейса является получателем.В классе типов конкретизирующий тип может появляться в любой позиции аргумента или в типе возвращаемого значения функции (т. Е. Вы можете сказать, что если Foo является экземпляром типа Bar, должна существовать функция с именем baz, которая принимает Int и возвращает Foo -Вы не можете сказать это с интерфейсами).
6 голосов
/ 06 июня 2010

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

Go не имеет ничего подобного.

5 голосов
/ 06 июня 2010

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

3 голосов
/ 06 июня 2010

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

...