Ошибка повторения пар в последовательностях

Прочитав этот вопрос, я ожидаю, что сработает следующее:

Seq( Seq(1,2,3) , Seq(4,5,6) ).transpose()

но увы:

error: not enough arguments for method transpose: (implicit asTraversable: 
Seq[Int] => scala.collection.GenTraversableOnce[B])Seq[Seq[B]].
Unspecified value parameter asTraversable.
          Seq( Seq(1,2,3) , Seq(4,5,6) ).transpose()

Кроме того, я не могу найти никакой ссылки на транспонирование в документации scala, хотя Seq ссылается на него

Предоставление личности, похоже, как-то работает:

scala> Seq( Seq(1,2,3) , Seq(4,5,6) ).transpose( a => a)
res10: Seq[Seq[Int]] = List(List(1, 4), List(2, 5), List(3, 6))

Но все равно возвращает List вместо Seq


person scala_newbie    schedule 23.11.2012    source источник


Ответы (1)


Просто используйте его без скобок:

Seq( Seq(1,2,3) , Seq(4,5,6) ).transpose
//res0: Seq[Seq[Int]] = List(List(1, 4), List(2, 5), List(3, 6))

Но по-прежнему возвращает List вместо Seq

Ну, на самом деле List является наследником Seq, так что в конце концов вы получили Seq (посмотрите на левую часть результата).

Причина такого поведения в том, что транспонирование на самом деле определено как функция с аргументом, но так как его аргумент определен как implicit у вас есть возможность делегировать работу по замене аргумента компилятору scala (он выполнит поиск во время компиляции для вас).

Если вы пишете круглые скобки, любая функция должна иметь перегруженную форму без аргументов, например.

def transpose() = ...

или вам нужно что-то написать внутри них (на самом деле это вопрос синтаксиса).

person om-nom-nom    schedule 23.11.2012
comment
Ага, понятно! Я до сих пор не понимаю, как именно работает вызов без фигурных скобок. Предоставляет ли scala аргумент по умолчанию в этом случае? Почему этого не происходит при использовании фигурных скобок? - person scala_newbie; 23.11.2012