使用`of`关键字的F#类型定义

时间:2014-04-18 11:51:26

标签: f#

让我说我在F#中非常环保(但在C#方面有4年经验)。我想开始学习F#,我正在学习TryFSharp.org教程。我来到computation expressions,但事情并不完全清楚。所以我开始谷歌吧。我遇到了 another tutorial / article ,它在第一个示例(日志记录示例)中解释得更好。但后来我继续读到第二个例子;我无法遵循代码的流程或它应该如何工作,也许是因为我不理解State类型的定义:

type State<'a, 's> = State of ('s -> 'a * 's)

我已经使用了F#中的一些简单类型,我看过structclassrecord但我不知道如何阅读此类型或它是什么去做。我也无法弄清楚of关键字在那里做了什么。

所以我的问题是:这个类型定义做了什么/它中的of关键字做了什么?

2 个答案:

答案 0 :(得分:5)

该代码定义了一个名为State的{​​{3}}类型,其唯一的构造函数也被命名为State,并采用类型为's -> 'a * 's的参数。 of关键字将构造函数名称与其参数类型分开。

所以基本上它表示State's -> 'a * 's类型的函数,但你需要使用State构造函数来创建State,因此必须写let myState = State someFunction而不是let myState = someFunction

答案 1 :(得分:3)

如前所述,State是单一案例歧视联盟类型。两个案例的联合类型如下:

type Multi = 
  | First of name:string
  | Second of number:int

考虑这一点的一种方法是Multi作为基类,FirstSecond作为子类,其中First需要构造函数中的字符串Second需要一个int。这是一个非常强大的构造,在C#中不可用。它很强大,因为您可以模式匹配此类型的值,编译器将强制您处理每个案例。

单个案例联合作为另一种类型的包装有用。在您的示例中,State类型将函数从类型's包装到一对(C#元组)'a * 's。事实证明,这是一个非常有趣的类型,因为它形成了一个monad,因此你可以获得各种各样的函数。例如,this gist显示State monad如何用于实现函数随机值生成器。