2016-08-25 3 views
2

Пусть я определяю zipWith так:Как устранить несоответствие этого типа?

def zipWith[A](f:(A, A) => A)(xs:Iterable[A], ys:Iterable[A]): Iterable[A] = 
    (xs, ys).zipped map f 

Теперь я хотел бы использовать для архивирования матрицы так:

type Matrix = Vector[Vector[Int]] 

val zipMatrix: ((Int, Int) => Int) => Matrix => Matrix => Matrix = f => 
    zipWith(zipWith(f)) 

Однако я получил ошибку:

<console>:15: error: type mismatch; 
found : (Iterable[Iterable[Int]], Iterable[Iterable[Int]]) => Iterable[Iterable[Int]] 
required: Matrix => (Matrix => Matrix) 
(which expands to) scala.collection.immutable.Vector[Vector[Int]] => (scala.collection.immutable.Vector[Vector[Int]] => scala.collection.immutable.Vector[Vector[Int]]) 

Почему не Vector[Vector[Int]] соответствует Iterable[Iterable[Int]]? Как исправить эту ошибку?

ответ

1

Рассмотрим:

def zipWith[A] (f:(A => A => A))(xs:Vector[A])(ys:Vector[A]): Vector[A] = 
    (xs, ys).zipped.map {case (x, y) => f (x)(y)} 

val zipMatrix: (Int => Int => Int) => (Matrix => Matrix => Matrix) = f => 
    zipWith(zipWith(f)) 
+0

Спасибо, но я хотел бы получить более общее решение. Чем больше общее, тем лучше :) – Michael

+0

Хорошо, тогда, возможно, вам следует определить тип матрицы более «общий»? type Matrix = Iterable [Iterable [Int]]? – Nyavro

+0

Возможно. Но что не так с Vector [Vector [Int]] '? Предположим, я не могу изменить тип «Матрица». – Michael

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