让我说我在F#中非常环保(但在C#方面有4年经验)。我想开始学习F#,我正在学习TryFSharp.org教程。我来到computation expressions,但事情并不完全清楚。所以我开始谷歌吧。我遇到了 another tutorial / article ,它在第一个示例(日志记录示例)中解释得更好。但后来我继续读到第二个例子;我无法遵循代码的流程或它应该如何工作,也许是因为我不理解State
类型的定义:
type State<'a, 's> = State of ('s -> 'a * 's)
我已经使用了F#中的一些简单类型,我看过struct
,class
,record
但我不知道如何阅读此类型或它是什么去做。我也无法弄清楚of
关键字在那里做了什么。
所以我的问题是:这个类型定义做了什么/它中的of
关键字做了什么?
答案 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
作为基类,First
和Second
作为子类,其中First
需要构造函数中的字符串Second
需要一个int。这是一个非常强大的构造,在C#中不可用。它很强大,因为您可以模式匹配此类型的值,编译器将强制您处理每个案例。
单个案例联合作为另一种类型的包装有用。在您的示例中,State
类型将函数从类型's
包装到一对(C#元组)'a * 's
。事实证明,这是一个非常有趣的类型,因为它形成了一个monad,因此你可以获得各种各样的函数。例如,this gist显示State
monad如何用于实现函数随机值生成器。