указание dot[Real]
явно должно работать тоже.
def rowDot(r1: Row, r2: Row) = dot[Real](_*_)(r1, r2)
РЕДАКТИРОВАТЬ
, отвечая на ваши изменения: я думаю, что проблема в том, что неявное преобразование из Array
в WrappedArray
не применяется рекурсивно, когда выесть Array[Array]
.
Array[Int]
не является Iterable[Int]
;обычно, когда вы присваиваете его Iterable, Array[Int]
неявно преобразуется в WrappedArray[Int]
(где WrappedArray
равен Iterable [Int]).Это то, что происходит, когда вы используете List[Array[Int]]
(вы получаете List[WrappedArray[Int]]
неявно).
Однако, как я уже сказал, неявное преобразование не применяется рекурсивно, поэтому Array[Array[Int]]
неявно не преобразуется в WrappedArray[WrappedArray[Int]]
.
Вот сеанс REPL, который демонстрирует проблему:
Список [Array [Int]] может быть назначен для Iterable [Iterable [Int]] (обратите внимание, что Array преобразуется в WrappedArray)
scala> val i : Iterable[Iterable[Int]] = List(Array(1,2), Array(1,2,3))
i: Iterable[Iterable[Int]] = List(WrappedArray(1, 2), WrappedArray(1, 2, 3))
Array [Array [Int]]не работает автоматически (как вы обнаружили)
scala> val j : Iterable[Iterable[Int]] = Array(Array(1,2), Array(1,2,3))
<console>:9: error: type mismatch;
found : Array[Array[Int]]
required: Iterable[Iterable[Int]]
val j : Iterable[Iterable[Int]] = Array(Array(1,2), Array(1,2,3))
^
Тем не менее, при некотором удерживании (преобразовании внутренних массивов вручную в WrappedArrays вручную) все работает снова:
scala> import scala.collection.mutable.WrappedArray
import scala.collection.mutable.WrappedArray
scala> val k : Iterable[Iterable[Int]] = Array(WrappedArray.make(Array(1,2)),
WrappedArray.make(Array(1,2,3)))
k: Iterable[Iterable[Int]] = WrappedArray(WrappedArray(1, 2), WrappedArray(1, 2,
3))