Анонимные функции и Карты в Scala - PullRequest
2 голосов
/ 17 августа 2010

Я не уверен, почему это не работает:

scala> case class Loader(n: String, x: String, l: List[String])
scala> val m: Map[String, (List[String])=>Loader] = 
     | Map("x" -> Loader("x", "x1", _:List[String]))              

<console>:8: error: type mismatch;
 found   : (List[String]) => (java.lang.String, Loader)
 required: (String, (List[String]) => Loader)
       Map("x" -> Loader("x", "x1", _:List[String]))

но это работает?

scala> Loader("t", "x", _:List[String])
res7: (List[String]) => Loader = function1>

scala> val m = Map("x" -> res7)
m: scala.collection.immutable.Map[java.lang.String,(List[String]) => Loader] =
  Map((String,function1>))

Ответы [ 2 ]

5 голосов
/ 18 августа 2010

Еще одна жертва перегрузки _ в Скале. Учтите это:

f(_, 5) + 1 // Partial function application
f(_ + 1, 5) // Closure

В первом случае _ заменяет весь параметр. В этом случае это означает частичное применение f. На практике это эквивалентно x => f(x, 5) + 1, поскольку все выражение, которое содержит f, превращается в замыкание.

Во втором случае _ является частью выражения. В этом случае все выражение превращается в замыкание, вплоть до любого разделителя выражений. Я имею в виду, что если выражение вложено в другое, только внутреннее выражение превращается в замыкание. На практике это эквивалентно f(x => x + 1, 5).

4 голосов
/ 17 августа 2010

Парсер не был уверен, куда положить начало анонимной функции. Иногда вы можете решить эту проблему, добавив еще одну пару скобок (хотя и не всегда):

val m: Map[String, (List[String])=>Loader] =
Map("x" -> (Loader("x", "x1", _:List[String])))

Я не вижу здесь двусмысленности, так что, возможно, она не была достаточно умной, чтобы понять это. Я думаю, парсер упустил возможность иметь анонимную функцию сразу после -> (которая также является конструкцией библиотеки и использует магию неявного и все остальное, что делает цикл анализа маленьким парсером).

Когда вы пишете это как явный кортеж, все будет работать нормально.

val m: Map[String, (List[String])=>Loader] =
Map(("x", Loader("x", "x1", _:List[String])))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...