我才刚刚开始学习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 c
和snd c
或使用模式匹配来访问元素。
使用类型别名有时会很有用,但我想在这种情况下,更希望使用区分大小写的联合或记录,即:
type Complex = { a:float; b:float } // Using a record
type Complex = Complex of float * float // Using a discriminated union
有关F#记录的文档说明了使用记录需要了解的所有内容。对于单例区分的联合,可以在F#上的“按类型进行设计”系列中的一篇文章中获得乐趣和收益。