2014-12-04 4 views
0

У меня есть список кортежей, называемый item, каждый индекс в списке содержит 2 x Double s, например.Scala foldLeft too many parameters

item = ((1.0, 2.0), (3.0, 4.0), (10.0, 100.0)) 

Я хочу, чтобы выполнить расчет по каждому индексу в списке item, и я пытаюсь сделать это с foldLeft. Это мой код:

item.foldLeft(0.0)(_ + myMethod(_._2, _._1, item.size))) 

_._2 доступ к текущему item кортежу индекса 1 и _._1 доступа к текущему item кортежа индекса 0. например, для первого раза оно должно быть эффективно:

item.foldLeft(0.0)(_ + myMethod(2.0, 1.0, item.size))) 

Второй Fold:

item.foldLeft(0.0)(_ + myMethod(4.0, 3.0, item.size))) 

Третий Fold:

item.foldLeft(0.0)(_ + myMethod(100.0, 10.0, item.size))) 

где MyMethod:

def myMethod(i: Double, j:Double, size: Integer) : Double = { 
    (j - i)/size 
    } 

Это давая мне ошибку, в которой говорится, что re - слишком много параметров для foldLeft, так как для этого требуется 2 параметра. myMethod возвращает Double, а _ - Double. Итак, где этот дополнительный параметр, который видит компилятор?

Если я это сделать:

item.foldLeft(0.0)(_ + _._1)) 

Он суммирует все первые Double с в каждом индексе item - замена _._ 1 с _._ 2 резюмирует все вторые Double с в каждом индексе item ,

Любая помощь очень ценится!

ответ

3

Каждый _ эквивалентен новому аргументу, поэтому (_ + myMethod(_._2, _._1, item.size)) является анонимной функцией с тремя аргументами: (x, y, z) => x + myMethod(y._2, z._1, item.size).

Что вы хотите, это (acc, x) => acc + myMethod(x._2, x._1, item.size).

+0

** спасибо **! Я должен был спросить 4 часа назад. Исходя из фона Java, я с трудом хватаю '_'. Еще раз спасибо! – monster

+0

Я рад, что это помогло :) – Dimitri