2013-11-08 2 views
0

У меня есть два решения, но один не компилируется, а другие, я думаю, может быть лучше:Какой самый быстрый идиоматический способ добавить все векторы (в математическом смысле) в список Scala?

object Foo extends App { 
    val vectors = List(List(1,2,3), List(2,2,3), List(1,2,2)) //just a stupid example 

    //transposing 
    println("vectors = " + vectors.transpose.map (_.sum)) //it prints vectors = List(4, 6, 8) 

    //folding 
    vectors.reduce { 
     case (a, b) => (a zip b) map { 
      case (x, y) => x + y 
     } 
    } //compiler says: missing parameter type for exp. function; arg. types must be fully known 
} 

ответ

5

reduce принимает Function2 аргумента, но вы дали ему PartialFunction.

vectors reduce { (a, b) => (a zip b) map { case (x, y) => x+y } } 

Edit: Мой код работает, но @sschaef отметил, что мое объяснение было неправильно: код davips не игровой компилировать из-за ограничения в области вывода типа. См Type inference fails on Set made with .toSet?

+2

не является 'PartialFunction', он просто используется для сравнения с шаблоном. – sschaef

+0

Блок с предложениями 'case', используемый без' match', является 'PartialFunction', не так ли? Например, введите это в REPL: {case "a" => true}: PartialFunction [String, Boolean] –

+0

Нет, это не так, это нормальная функция. Просто, когда вы сообщаете компилятору, что вы хотите частичную функцию, вы получите ее. Пример: «Список (1,« str ») map {case s: String => s} ==> MatchError' – sschaef

1
val vectors = List(List(1,2,3), List(2,2,3), List(1,2,2)) 

implicit class VectorizedOps[T : Numeric](vec: List[T]) { 
    private val numeric = implicitly[Numeric[T]] 
    def +(other: List[T]) = (vec zip other).map { case (x, y) => numeric.plus(x, y) } 
} 

val sum = vectors.reduce(_ + _) 

Может быть, не быстрее, но более идиоматических

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