如何在 F# 中以自己定义的类型正确访问元素



我刚刚开始学习F#,对这个学校作业感到困惑。如果这是一个愚蠢的问题,请原谅我,我无法通过搜索找到答案。作业希望我:

复数的集合是实对的集合。

定义一个类型complex,该类型表示具有浮点分量的复数。

定义给定两个浮点数的函数mkComplex : float -> float -> complex数字返回相应的复数。

定义一个函数complexToPair : complex -> float * float给定一个复数(a,b(返回对 (a, b( 。

这是我对此的尝试: 首先我定义类型complex

type Complex = float * float

我定义函数mkComplex

let mkComplex a b = Complex (a, b)

complexToPair的功能是给我带来麻烦的功能。如何让复杂类型正确访问其中的元素?以下工作运行良好,但我收到带有类型检查错误的垃圾邮件。

let complexToPair (a: Complex) = (a.[0], a.[1])

a.[0]a.[1]以红色下划线下划线,并给我以下警告:

运算符 'expr.[idx]' 已用于基于此程序点之前的信息的不确定类型的对象。请考虑添加更多类型约束。

那么,我做错了什么?代码工作得很好。

您正在使用的类型定义正在定义类型别名。当你说:

type Complex = float * float

那么类型Complex只是一个元组。您可以使用(1.0, 1.0)创建其值。当您具有此类型的值c时,可以使用fst csnd c或使用模式匹配来访问元素。

使用类型别名有时很有用,但我想,在这种情况下,使用单大小写可区分的联合或记录会更可取,即:

type Complex = { a:float; b:float }       // Using a record
type Complex = Complex of float * float   // Using a discriminated union

有关 F# 记录的文档介绍了有关使用记录的所有信息。对于单情况的可区分联合,可以参考 F# 上的"使用类型进行演唱"系列中的一篇文章,以获得乐趣和利润。

相关内容

最新更新