在F#中将字符串列表转换为浮点数/整数

时间:2013-12-29 12:38:34

标签: f# c#-to-f#

是否有一种快速简单的方法将整个字符串列表转换为浮点数或整数 并在F#中将它们添加到一起?

foreach(string s in list)
{
    sum += int.Parse(s);
}

3 个答案:

答案 0 :(得分:14)

这样的事情会产生同样的效果:

let sum = list |> Seq.map System.Int32.Parse |> Seq.sum

F#似乎不支持在int上引用该方法,因此我不得不使用System.Int32

在F#中,类型seq是.NET IEnumerable的别名,因此此代码适用于数组,列表等。

注意在“无点”样式中使用Parse - 没有参数的函数可以直接用作期望该类型的另一个函数的参数。在这种情况下,Seq.map具有以下类型:

('a -> 'b) -> seq<'a> -> seq<'b>

由于System.Int32.Parse的类型为string -> intSeq.map System.Int32.Parse的类型为seq<string> -> seq<int>

答案 1 :(得分:14)

如果你想瞄准最少数量的字符,那么你可以简化Ganesh发布的解决方案:

let sum = list |> Seq.sumBy int

这几乎完全相同 - int函数是将任何东西转换为整数的通用转换(它也适用于字符串)。 sumBy函数是mapsum的组合,它首先将所有元素投影到数值,然后对结果求和。

答案 2 :(得分:0)

从技术上讲,至少有3种不同的方法:

1)其他答案中描述的Seq.sum或sumBy方法是在F#中获得总和的规范方法:

let sum = Seq.sumBy int list

2)出于教学目的,可以看出在F#中模拟C#行为的接近程度可能很有意义;例如,使用参考单元格类型:

let inline (+=) x y = x := !x + y
let sum = ref 0
for s in list do sum += int s

3)与2)相同的想法,但使用byref指针类型:

let inline (+=) (x:_ byref) y = x <- x + y
let mutable sum = 0
for s in list do &sum += int s