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

Syn*_*der 2 f#

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

type State<'a, 's> = State of ('s -> 'a * 's)
Run Code Online (Sandbox Code Playgroud)

我曾与几个简单的类型在F#已经工作过,我所看到的struct,class,record但我不知道如何阅读此类型或什么是应该做的.我也无法弄清楚of关键字在那里做了什么.

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

sep*_*p2k 5

该代码定义了一个被区分的联合类型,State其唯一的构造函数也被命名State并接受一个类型的参数's -> 'a * 's.该of关键字将构造函数名称与其参数类型分开.

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


eul*_*rfx 5

如前所述,State是单例歧视联合类型。两种情况的联合类型如下所示:

type Multi = 
  | First of name:string
  | Second of number:int
Run Code Online (Sandbox Code Playgroud)

一种方法是将其视为Multi基类和FirstSecond类,其中First构造函数中需要一个字符串,并且Second需要一个 int。这是 C# 中不具备的非常强大的构造。它很强大,因为您可以对这种类型的值进行模式匹配,并且编译器将强制您处理每种情况。

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