如何在seq <type>?</type>上总结一个成员

时间:2011-01-26 10:05:15

标签: f#

有人可以帮助我在这里漂浮吗?对于F#来说还是新手,实际上是第一次尝试使用它来处理严重的问题,但却陷入了这个nOOb问题。

我有一个资产类型

type Asset(line:string) = 
    let fields = line.Split(',') 
    member this.EAD = Double.Parse(fields.[8])

然后我将csv文件公开为seq&lt; Asset&gt;:
这里的'数据'是seq&lt; string&gt;文件中的行

let assets = Seq.map(fun line -> Asset(line)) data

现在我想获得这些资产的总EAD,但是我收到错误

'This value is not a function and cannot be applied'.

以下是我尝试过的一些事情:

let totEAD = Seq.sum(a.EAD) assets // first try
let totEAD = Seq.sum(fun(a)->a.EAD) assets // pretty sure this is a function..

let getEad(a:Asset) = a.EAD // val getEad : Asset -> float ... is it a val of a function?
let x = Seq.sum(fun (a) -> getEad(a)) assets // nope...

提前致谢,

格特 - 扬

更新

这很有效,但我仍然感到困惑,为什么我不能一气呵成,有什么提示呢?

let x = Seq.map(fun (a:Asset) -> a.EAD) assets // first turn it into a seq<float>
let tot = Seq.sum(x)

1 个答案:

答案 0 :(得分:16)

你的问题是Seq.sum假设它能够处理整个类型并且不接受lambda。它正在寻找在您的类型上定义的(+)运算符。你想要做的是使用sumBy,它接受一个lambda。

此外,更喜欢管道衬里语法。如果您首先指定输入序列,那么聪明的类型推断系统可以在sumBy lambda中自动处理您正在处理的类型,因此您不必添加类型注释:

let total =
    assets 
    |> Seq.sumBy( fun a -> a.EAD )