首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在F#中正确访问自己定义的类型中的元素

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

Stack Overflow用户
提问于 2020-02-04 21:34:59
回答 1查看 182关注 0票数 2

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

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

定义一个用浮点组件表示复数的类型complex

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

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

下面是我的尝试:首先,我定义了complex类型

代码语言:javascript
复制
type Complex = float * float

我定义了函数mkComplex

代码语言:javascript
复制
let mkComplex a b = Complex (a, b)

函数complexToPair是给我带来麻烦的函数。如何让复杂类型正确地访问其中的元素?以下工作运行良好,但我是垃圾邮件与排版错误。

代码语言:javascript
复制
let complexToPair (a: Complex) = (a.[0], a.[1])

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

运算符'expr.idx‘已用于基于此程序点之前的信息的不确定类型的对象。考虑添加进一步的类型约束。

那我做错什么了?代码运行得很好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-04 21:52:57

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

代码语言:javascript
复制
type Complex = float * float

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

使用类型别名有时是有用的,但我想,在这种情况下,最好使用单一的受歧视的联合或记录,即:

代码语言:javascript
复制
type Complex = { a:float; b:float }       // Using a record
type Complex = Complex of float * float   // Using a discriminated union

关于F#记录的文档解释了您需要了解的关于使用记录的一切。对于单一情况下受歧视的工会,您可以参考与类型系列设计中的一篇文章 at F#获得乐趣和利润。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60065851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档