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

Имеют ли алгебраические типы данных в Haskell равные дискриминированные союзы в F #?

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

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

4b9b3361

Ответ 1

(Я пришел из 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 # этого не делать. Вы можете вручную определить свои собственные функции для каждого конструктора.

Ответ 2

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