Как подвести итоги Участника по seq <type>? - PullRequest
4 голосов
/ 26 января 2011

Может ли кто-нибудь помочь мне здесь на плаву? Все еще новичок в F #, впервые пытаюсь использовать его для чего-то серьезного, но застрял в этой проблеме с nOOb.

У меня есть тип Актив

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

Затем я выставляю CSV-файл как последовательность :
'data' - это последовательность строк в файле

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 Ответ

16 голосов
/ 26 января 2011

Ваша проблема здесь в том, что Seq.sum предполагает, что он способен работать на весь тип и не принимает лямбду. Он ищет оператор (+), который будет определен для вашего типа. То, что вы хотите сделать, это использовать sumBy, который принимает лямбду.

Кроме того, предпочитайте синтаксис конвейерной линии. Если вы сначала укажете входную последовательность, то умная система логического вывода типа может затем определить в lambda sumBy, с каким типом вы имеете дело, автоматически, поэтому вам не придется добавлять аннотации типов:

let total =
    assets 
    |> Seq.sumBy( fun a -> a.EAD )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...