F#对类型和数据构造函数的定义是否与Haskell相同



在阅读Scott Wlaschin对递归类型的精彩介绍时,我注意到他在下面的区别并集定义中将Book的case构造函数称为类型构造函数。

type Gift =
| Book of Book
| Chocolate of Chocolate 
| Wrapped of Gift * WrappingPaperStyle
| Boxed of Gift 
| WithACard of Gift * message:string

在以下部分:

类型构造函数和处理程序之间的关系

Scott说:

Gift.Book构造函数获取一本书并返回一个Gift

其中Book为:

type Book = {title: string; price: decimal}

对我来说,这听起来像是一个数据构造函数,而不是一个类型构造函数。有趣的是,数据构造函数这个术语在F#语言规范中只使用过一次,我在同一个文档中找不到任何关于它的描述。

F#中是否明确定义了这些概念?我认为上面的帖子应该引用数据构造函数而不是类型构造函数,这是错误的吗?

要在Haskell中描述SUM类型,请执行以下操作:

data Mytype = Yes | No

并且您将其称为Yes是数据构造函数的数据类型。

在F#中:

type MyType = Yes | No

并且您将其称为有区别的并集,将Yes称为并集大小写以及(并集(大小写构造函数。

在这两种情况下,我们都是指代数数据类型。

最新更新