我刚刚开始学习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# 上的"使用类型进行演唱"系列中的一篇文章,以获得乐趣和利润。