gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:38:12 26 4
gpt4 key购买 nike

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

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

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

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

定义一个函数 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

documentation on F# records解释了您需要了解的有关使用记录的所有信息。对于单例歧视联合,可以引用 an article in the Desinging with Types series在 F# 的乐趣和利润。

关于f# - 如何在 F# 中以自己定义的类型正确访问元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60065851/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com