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

gjv*_*amp 4 f#

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

我有一个类型的资产

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

然后我将一个csv文件暴露为seq <Asset>:
'data'这里是文件中行的seq <string>

let assets = Seq.map(fun line -> Asset(line)) data
Run Code Online (Sandbox Code Playgroud)

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

'This value is not a function and cannot be applied'.
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的一些事情:

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...
Run Code Online (Sandbox Code Playgroud)

提前致谢,

格特 - 扬

更新:

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

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

Ros*_*lay 16

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

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

let total =
    assets 
    |> Seq.sumBy( fun a -> a.EAD )
Run Code Online (Sandbox Code Playgroud)