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