有人可以帮助我在这里漂浮吗?对于F#来说还是新手,实际上是第一次尝试使用它来处理严重的问题,但却陷入了这个nOOb问题。
我有一个资产类型
type Asset(line:string) =
let fields = line.Split(',')
member this.EAD = Double.Parse(fields.[8])
然后我将csv文件公开为seq< Asset>:
这里的'数据'是seq< string>文件中的行
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)
答案 0 :(得分:16)
你的问题是Seq.sum假设它能够处理整个类型并且不接受lambda。它正在寻找在您的类型上定义的(+)运算符。你想要做的是使用sumBy,它接受一个lambda。
此外,更喜欢管道衬里语法。如果您首先指定输入序列,那么聪明的类型推断系统可以在sumBy lambda中自动处理您正在处理的类型,因此您不必添加类型注释:
let total =
assets
|> Seq.sumBy( fun a -> a.EAD )