Арифметика c с типами десятичных списков в F # - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть функция, которая вычисляет дисперсию портфеля, но я получаю небольшую проблему, здесь ошибки с (List.sum(eachlist)) / (decimal(List.length(eachlist))) для пояснения, я выбираю каждый список из списков списков и получаю его среднее / среднее и проходное

Error   FS0001  This expression was expected to have type
    'List<decimal> -> 'a'    
let assetreturns = [[1M;2M;3M];[4M;5M;6M];[7M;8M;9M];[10M;11M;12M]]
let weights = [1M;2M;3M;4M]

let var = assetreturns |> List.map(fun eachlist -> eachlist 
                                                                |> (List.sum (eachlist)) / (decimal(List.length(eachlist)))
                                                                |> List.averageBy (fun x -> sqr (eachlist - x)))
            let weightssquared  =  weights |> List.map(fun x -> x * x)

            let porvarleft = List.zip weightssquared  var |> List.sumBy(fun (a,b) -> a * b)
            let porvarright = List.zip var weights |> List.sumBy(fun (a,b) -> a * b) 
            let portfoliovarright = porvarright * 2M
            let portfoliovariance =(porvarleft +  portfoliovarright)
            portfoliovariance```

1 Ответ

1 голос
/ 04 апреля 2020

Проблема в том, что (List.sum eachlist) / (decimal (List.length (eachlist)))) возвращает десятичное число, и вы отправляете его в функцию, которая ожидает список (List.averageBy f). Попробуйте вместо этого:

let var =
    assetreturns
    |> List.map (fun eachlist ->
        let avg = List.average eachlist
        eachlist |> List.averageBy (fun x -> pown (x - avg) 2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...