我刚开始学习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‘已用于基于此程序点之前的信息的不确定类型的对象。考虑添加进一步的类型约束。
那我做错什么了?代码运行得很好。
发布于 2020-02-04 21:52:57
正在使用的类型定义是定义类型别名。当你说:
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#记录的文档解释了您需要了解的关于使用记录的一切。对于单一情况下受歧视的工会,您可以参考与类型系列设计中的一篇文章 at F#获得乐趣和利润。
https://stackoverflow.com/questions/60065851
复制相似问题