有人可以帮助我漂浮在这里吗?对于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)