F#一次将函数应用于两个列表

时间:2015-06-30 12:57:27

标签: list f# functional-programming

我只是自己跳进F#,将一个简单的金融工具翻译为练习。我还在等邮件中的参考书。这里有一些我认为F#可以用多种聪明聪明的方式做的事情,但我无法解决语法错误。

我有一个名为Delta的功能选项评估,我想应用它 - 通过两个(并行)输入值列表:

let Delta f k v t r = exp(-r * t) * CDF(D1 f k v t)

let priceList = [100.0; 98.0; 102.0; 100.0]  //f
let strike = 100.0                           //k
let vol = 0.30                               //v
let timeList = [1.0; 0.9; 0.8; 0.7]          //t
let rt = 0.005                               //r

所以这个函数是递归过程的一部分(使用Newton的方法)。我很乐意制作一个相同长度的增量列表[d1; D2; D3; d4] [编辑:我坚持按照所需结果的增量列表]。我正在寻找聪明的F#方式 - 一举 - 使用列表功能。我试图将这种Delta函数强制转换为这种基本模式:

  let sumList = List.map2 (fun x y -> x + y) list1 list2

(似乎许多列表函数可以让我获得Delta列表或Delta列表的总和。)我没有接近猜测法律语法。我还试过了#34; Match head :: tail"模式也是。

编辑:我在这里因为我要求的东西而烦恼,因为我在所有名单中游泳了一下。我不熟悉的功能。让我自己关注:我可以应用(Delta f k v t r)作为(Delta priceList strike vol timeList rt)并生成deltaList,价格,时间和增量都是相同的长度吗?

1 个答案:

答案 0 :(得分:2)

正如其他人在评论中指出的那样,你的问题并不完全清楚 - 如果你给出了一个你希望获得的输入和输出的具体例子,那么回答会更容易。

也就是说,如果你想用各种值作为参数调用Delta,那么你需要做两件事。大多数参数只是普通值,所以你可以直接传递; priceListtimeList是集合,因此我假设您要为其所有元素计算Delta。为此,您可以使用Seq.zipSeq.map

Seq.zip priceList timeList 
|> Seq.map (fun (f, t) -> Delta f strike vol t rt)