Являются ли алгебраические типы данных в Haskell равными дискриминационными объединениями в F #? - PullRequest
20 голосов
/ 16 ноября 2011

Я изучаю Haskell и хотел бы знать, являются ли конструкции, известные в Haskell как алгебраические типы данных, такими же, как различимые объединения в F #, или между ними есть некоторые тонкие различия.

Я также был бы очень признателенхорошее сравнение между F # (мой первый функциональный язык) и другими функциональными языками, особенно в том, что касается схожих понятий, но с существенными, но важными отличиями.

Ответы [ 2 ]

9 голосов
/ 17 ноября 2011

(Я из OCaml, но я просмотрел соответствующие материалы F # и, кажется, то же самое. Поправьте меня, если я ошибаюсь.) Они одинаковы, просто разные термины для одного и того же, но есть несколькосинтаксические различия.Например, чтобы определить конструктор с несколькими элементами данных, в OCaml и F # вы пишете тип, как если бы они были вставлены в кортеж:

Haskell:

data Whatever = Foo TypeA TypeB

OCaml / F #:

type whatever = Foo of typeA * typeB

Аналогично, для сопоставления с шаблоном вы аналогично действуете как один аргумент, который является кортежем со всеми элементами данных, вставленными внутрь:

Haskell:

case x of Foo a b -> ...

OCaml / F #:

match x with Foo (a, b) -> ...

Редактировать: очевидно, что следующее не применяется в F #

Кроме того, в Haskell конструктор автоматически становится функцией, которую вы можете использовать с помощьюсамо по себе, как и любое другое значение:

zipWith Foo xs ys

OCaml / F # не делайте этого.Вы можете вручную определить свои собственные функции для каждого конструктора.

4 голосов
/ 16 ноября 2011

Я не очень знаком с Haskell (я только прочитал Learn You a Haskell ), но я еще не сталкивался с принципиальной разницей между DU и алгебраическим Haskellтипы данных - они обе пытаются моделировать одну и ту же концепцию.Сказав это, F # и Haskell имеют очень разные системы типов (например, Haskell имеет классы типов / типы с более высоким родом; F # глубоко основан на ООП и т. Д.), Поэтому существует асимметрия, но ничто не ограничено этими типами данных.

...