温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - How to access elements correctly in own defined type in F#
f#

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

发布于 2020-04-19 12:50:51

我才刚刚开始学习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]'。考虑添加其他类型约束。

那么,我在做什么错呢?该代码工作正常。

查看更多

提问者
PineappleDude
被浏览
55
Tomas Petricek 2020-02-05 05:52

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

type Complex = float * float

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

使用类型别名有时会很有用,但我想在这种情况下,更希望使用区分大小写的联合或记录,即:

type Complex = { a:float; b:float }       // Using a record
type Complex = Complex of float * float   // Using a discriminated union

有关F#记录文档说明了使用记录需要了解的所有内容。对于单例区分的联合,可以在F#上的“按类型进行设计”系列的一篇文章中获得乐趣和收益。