我正在学习 Haskell,想知道 Haskell 中称为代数数据类型的构造是否与 F# 中的可区分联合相同,或者它们之间存在一些细微的差异。
我还希望能将 F#(我的第一个函数式语言)与其他函数式语言进行很好的比较,尤其是在概念相似但存在实质性但重要差异的方面。
我正在学习 Haskell,想知道 Haskell 中称为代数数据类型的构造是否与 F# 中的可区分联合相同,或者它们之间存在一些细微的差异。
我还希望能将 F#(我的第一个函数式语言)与其他函数式语言进行很好的比较,尤其是在概念相似但存在实质性但重要差异的方面。
(我来自 OCaml,但我查看了相关的 F# 东西,它似乎相同。如果我错了,请纠正我。)它们是相同的,只是同一事物的不同术语,但有一些语法差异。例如,要定义具有多个数据元素的构造函数,在 OCaml 和 F# 中,您可以将类型编写为将它们填充到元组中:
哈斯克尔:
data Whatever = Foo TypeA TypeB
OCaml / F#:
type whatever = Foo of typeA * typeB
类似地,要对其进行模式匹配,您同样可以像一个单独的参数一样操作,它是一个包含所有数据成员的元组:
哈斯克尔:
case x of Foo a b -> ...
OCaml / F#:
match x with Foo (a, b) -> ...
编辑:显然以下不适用于 F#
此外,在 Haskell 中,构造函数自动成为一个函数,您可以像任何其他值一样单独使用它:
zipWith Foo xs ys
OCaml/F# 不要这样做。您可以为每个构造函数手动定义自己的函数。
我对 Haskell 不是很熟悉(我只读过Learn You a Haskell),但我还没有遇到 DU 和 Haskell 的代数数据类型之间的基本区别——它们都试图对相同的概念进行建模。话虽如此,F# 和 Haskell 具有非常不同的类型系统(例如,Haskell 具有类型类/更高类型的类型;F# 深深植根于 OOP 等),因此存在不对称性,但不限于这些数据类型。