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

8
让我先声明一下,虽然我有4年的C#经验,但在F#方面还非常新手。我想开始学习F#,并按照TryFSharp.org上的教程进行学习。我到了计算表达式(computation expressions)这一部分时,有些地方不太清楚。于是我开始搜索资料。我看到了另一个教程/文章,在第一个例子(日志记录)中解释得更好。但是当我看到第二个例子时,却无法理解代码的流程或它应该如何工作,也许是因为我不理解State类型的定义。
type State<'a, 's> = State of ('s -> 'a * 's)

我已经与F#中的一些简单类型合作过,我见过structclassrecord,但我不知道如何阅读此类型或它应该执行什么操作。我也无法弄清楚其中的of关键字是做什么的。

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

2个回答

9
该代码定义了一个 鉴别联合 类型,名为 State,它的唯一构造函数也命名为 State,并接受类型为 's -> 'a * 's 的参数。 of 关键字将构造函数名称与其参数类型分离。
因此,它基本上表示一个 State 是类型为 's -> 'a * 's 的函数,但是您需要使用 State 构造函数来创建一个 State,因此必须编写 let myState = State someFunction 而不是 let myState = someFunction

5

正如先前所述,State 是一个单一情况辨别联合类型。一个包含两个情况的联合类型看起来像这样:

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

一种思考方式是将Multi看作一个基类,FirstSecond看作子类,其中First需要在构造函数中传入一个字符串,而Second需要传入一个整数。这是一种非常强大的结构,在C#中不可用。它很强大,因为您可以对此类型的值进行模式匹配,并且编译器将强制您处理每个情况。
单个案例联合作为另一种类型的包装器非常有用。在您的示例中,State类型将一个从类型's到一对(C#元组)'a * 's的函数封装起来。结果证明,这是一种非常有趣的类型,因为它形成了一个单子,因此您可以得到各种各样的与它相关的函数。例如,此代码片段显示了如何使用State单子实现功能随机值生成器。

由于SynerCoder是F#的新手,因此值得一提的是,与基类/子类类比相反,联合案例(例如示例中的“First”和“Second”)不是(子)类型。 - Frank
真实的 - 在AST上没有定义子类型关系。但是在CLR中,DU使用子类型实现。 - eulerfx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接