2015-10-20 8 views
2

Так я пытаюсь умножить п-й элемент одного списка с п-го элемента другого списка и добавить их вместеКак умножить два два степени п элементов списка в F #

let listMulti xList yList = 
|> [for x in xList do 
     for y in yList do 
      yield x*y ] // multiplies all the elements on x with y 
|> List.filter(fun x-> List.nth % List.length (xList) =1) //gets the elements 1 , 4, 7 for a list of size 3. This is scalable 
|> List.sum //add them all up 

Так что идея здесь

>listMulti [1;2;3][4;5;6];; 
val it : int = 32 

Так 1 * 4 + 2 * 5 + 3 * 6 = 32 , но вместо этого им получить

ошибки FS0010: Неожиданный оператор инфиксного в связывании

Помощь?

ответ

3

Ошибка в том, что вы используете List.nth странным способом.

Я хотел бы сделать что-то вроде

List.zip xlist ylist 
|> List.sumBy (fun (a,b) -> a*b) 

Здесь list.zip объединяет списки - так что если у вас [1;2;3] и [4;5;6] вы получите [(1,4);(2,5);(3,6)]. Затем вы просто умножаете и суммируете за один раз.

+0

Я не могу заставить это работать. Я новичок в F # и не могу найти информацию о List.zip2 в Интернете. Я нашел List.zip и попытался заставить мою работу в карри работать вокруг нее, но, похоже, я ее не понимаю. Можете ли вы более подробно сказать об этом? – SuperCell

+0

Это была ошибка, я писал без компилятора - должен был быть просто zip. Добавлено некоторое объяснение –

+1

Спасибо, последний вопрос. Я получаю «Ожидая тип, поддерживающий оператор« + », но заданный тип функции. Возможно, вам не хватает аргумента функции.« let inner xList yList = List.zip xList yList |> Список .sum (fun (a, b) -> a * b) Почему это? Не List.zip xList yList возвращает список в конвейер? – SuperCell

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