2015-06-30 4 views
1

Я просто прыгаю в F # самостоятельно, делая перевод простого финансового инструмента в качестве упражнения. И я все еще жду ссылки на справочники. Вот что я представляю себе, что 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 

Так эта функция является частью рекурсивного процесса (с использованием Метод Ньютона). Я был бы счастлив создать список дельт одной длины [d1; d2; d3; d4] [отредактировано: Я придерживаюсь списка дельт в качестве желаемого результата]. Я ищу умный способ F # - одним махом - со списком функций. Я пытался впихнуть эту функцию Delta в этой базовой схеме: (. Похоже, что многие из функций, список мог бы получить мне список Delta или сумму списка Delta)

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

Я не сближаясь угадать юридический синтаксис. Я также попробовал шаблон «Match head :: tail».

EDIT: Я размышлял здесь о том, чего я прошу, потому что я немного купаюсь во всем Списке. функции, которые новы для меня. Позвольте мне сосредоточиться: могу ли я применить (Delta f k v t r) как (Delta priceList strike vol timeList rt) и произвести deltaList, причем цены, времена и дельта все одинаковой длины?

+3

Я не уверен, что я получил это право, вы хотите, чтобы запустить применение функции почленно в обоих списках? .. Если это так (и списки имеют одинаковую длину), вы можете закрепить их вместе и сопоставить результат по результирующему zip-списку. –

+1

, если они не совпадают с длиной, вы можете просто использовать 'Seq.zip' - это остановится, как только попробует один список (но он даст вам« seq' назад) – Carsten

+1

@Carsten. версия 'Seq.zip', которая заполняет более короткую входную последовательность с заданным значением по умолчанию. – Richard

ответ

2

Как было указано в комментарии, ваш вопрос не совсем ясен - если вы дали конкретный пример ввода и вывода, который хотите получить, было бы легче ответить.

Это, если вы хотите позвонить Delta с различными значениями в качестве параметров, тогда вам нужно сделать две вещи. Большинство параметров - это простые значения, поэтому те, которые вы можете передать напрямую; priceList и timeList - это коллекции, поэтому я предполагаю, что вы хотите рассчитать Delta для всех своих элементов. Чтобы сделать это, вы можете использовать Seq.zip и Seq.map:

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

Спасибо большое. Извините, я больше не пытался объяснять, но я чувствовал, что начинаю больше говорить о болоте, поэтому я колебался. Это потрясающе.Надеюсь, я начну получать интуитивное чувство для этого эффективного, но довольно загадочного синтаксиса. Еще раз спасибо. – RomnieEE

+0

Еще одно замечание, которое я сделал бы в качестве новичка, это то, что, когда я просматривал онлайн-учебники, я действительно не вижу Seq. примеры функций. Просто в основном список. функции. Другое совершенно отдельное решение с Seq. В итоге я нашел Seq.skip ... |> Seq.take ... |> Seq.toList для подписок. Надеюсь, я получу хорошую ссылку в книжной форме. – RomnieEE

+1

@ RomnieEE Предупреждение о самообновлении: мой курс Pluralsight «Структуры функциональных данных F #» охватывает Seqs (и другие коллекции) в некоторых, надеюсь, полезных, подробных. – Kit

Смежные вопросы