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

时间:2015-01-18 15:05:12

标签: f#

假设我有一个数字元组:

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

它与int混合float。为了进行平均值等计算,我必须将它们转换为float。怎么做转换?

2 个答案:

答案 0 :(得分:4)

我不知道你是如何最终得到那个元组的,我建议你回顾一下你的设计。我个人认为超过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

答案 1 :(得分:3)

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

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

您可能希望将数据导入另一个集合,例如a listsetarrayanother type of sequence,并让导入程序处理转换必要。例如,如果输入是字符串列表(取自文本文件等),System.Double.Parse或者,如评论中的ildjarn所指出的,float operator可以用来转他们成了花车:

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

这将返回[3.0; 5.0; 8.9; 45.0; 127.3],其类型为float listimmutable, singly-linked list双精度浮点数。