2015-05-02 4 views

ответ

6

Для List[A], flatMap ожидает функцию от A => GenTraversableOnce[B]. Проблема с использованием List.apply в этом конкретном синтаксисе заключается в том, что apply допускает повторяющиеся параметры A*, который является синтаксическим сахаром для Seq[A]. Так что List.apply действительно Seq[A] => List[A], что не то же самое, что и A => List[A]. И мы видим, что в сообщении об ошибке:

scala> l.flatMap(List.apply) 
<console>:9: error: polymorphic expression cannot be instantiated to expected type; 
found : [A]Seq[A] => List[A] 
required: Int => scala.collection.GenTraversableOnce[?] 
       l.flatMap(List.apply) 

Что вы можете сделать, это понять, что вы используете только один параметр:

scala> l.flatMap(List(_)) 
res5: List[Int] = List(1, 2, 3) 

scala> l.flatMap(List.apply(_)) 
res6: List[Int] = List(1, 2, 3) 

И l.flatMap(List) никогда не мог работать, потому что List является класс, и Scala не будет обрабатывать его с помощью сахара apply для получения l.flatMap(List.apply).

3

Это происходит потому, что List.apply использует: с переменным числом аргументов

def apply[A](xs: A*): List[A] 

Вы ищете метод, который превращает один элемент в список, содержащий только этот элемент. Для объекта List нет специального метода. Вместо этого они предоставляют более общий метод, который принимает любое количество аргументов, позволяя работать с вашим первым оператором (List(1, 2, 3)).

Вы должны предоставить круглые скобки, чтобы создать List только одного объекта, таким образом, вы должны сделать то же самое, обращаясь к методу apply с использованием _ подстановочные:

val listOfOne = List(1) 

l.flatMap(List(_)) 
l.flatMap(List.apply(_)) 
Смежные вопросы