如何在 F# 中将数字元组转换为浮点数?

How to convert a tuple of numbers to float in F#?

假设我有一个数字元组:

let mynum = (3, 5, 8.9, 45, 127.3)

它是 intfloat 的混合体。为了进行像 平均 这样的计算,我必须将它们转换为 float。如何进行转换?

输入是如何变成这种格式的?元组不应该以这种方式使用;它们用于几个对象的组合,这些对象是强 独立 类型的。

元组的类型随其长度而变化,因此没有直接的方法对它们执行序列操作。无论如何,它们与 seq<'T> 不兼容,因为它们的组件类型无关。 元组没有平均函数,如果有,则必须为所有可能的元数(组件数)重载。

您可能希望将数据导入另一个集合,例如a list, a set, an array, or another type of sequence, and have the importer handle conversions where necessary. For example, if the input were a list of strings (as taken from a text file or such), System.Double.Parse or, as pointed out by ildjarn in the comments, the float operator,可用于将它们变成浮点数:

let input = ["3"; "5"; "8.9"; "45"; "127.3"]
List.map float input

这个 returns [3.0; 5.0; 8.9; 45.0; 127.3],属于 float list 类型:immutable, singly-linked list 双精度浮点数。

我不知道你是怎么得到那个元组的,我建议你检查一下你的设计。我个人认为超过 4 个元素的元组是一种味道,可能是带有命名元素的记录最合适。

无论如何,你可以很容易地将它转换成一个浮点数列表,然后计算平均值:

let mynum = (3, 5, 8.9, 45, 127.3)
let inline cnv (x1, x2, x3, x4, x5) = [float x1; float x2; float x3; float x4; float x5]
let lst = cnv mynum // float list = [3.0; 5.0; 8.9; 45.0; 127.3]
List.average lst    // float = 37.84