H#中的代数数据类型是否在F#中具有相同的区分联合?

时间:2011-11-16 17:21:48

标签: haskell f# functional-programming algebraic-data-types discriminated-union

我正在学习Haskell,并且想知道Haskell中已知的代数数据类型的构造是否与F#中的区分联合相同,或者它们之间存在一些细微差别。

我也非常感谢F#(我的第一种功能语言)与其他功能语言之间的比较,特别是在类似概念方面,但具有重大但重要的差异。

2 个答案:

答案 0 :(得分:9)

(我来自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#不这样做。您可以为每个构造函数手动定义自己的函数。

答案 1 :(得分:4)

我对Haskell不是很熟悉(我只读过Learn You a Haskell)但我还没有看到DUs和Haskell的代数数据类型之间的基本区别 - 他们都试图建模同样的概念。话虽如此,F#和Haskell有非常不同的类型系统(例如,Haskell有类型类/更高级的类型; F#深深地基于OOP等)所以存在不对称性,但不限于这些数据类型。