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