Scala中的匿名函数和映射

时间:2010-08-17 17:22:24

标签: scala

我不确定为什么这不起作用:

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 个答案:

答案 0 :(得分:5)

Scala中_超载的另一个受害者。考虑一下:

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

在第一种情况下,_正在替换整个参数。在这种情况下,它代表f的部分应用。在实践中,它等同于x => f(x, 5) + 1,因为包含 f的整个表达式将变为闭包。

在第二种情况下,_是表达式的一部分。在这种情况下,整个表达式变成一个闭包,直到任何表达式分隔符 - 我的意思是,如果表达式嵌套在另一个表达式中,则只有内部表达式变为闭包。在实践中,它相当于f(x => x + 1, 5)

答案 1 :(得分:4)

解析器不知道在哪里放置匿名函数的开头。有时您可以通过添加另一对括号来解决此问题(但并非总是如此):

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

我在这里看不出任何含糊之处,所以它可能不够聪明,无法弄明白。我认为,解析器忽略了在->之后有一个匿名函数的可能性(它也是一个库构造并使用隐式魔法和所有wicket的东西使得小解析器的思想循环)。

当你把它写成一个明确的元组时,它会正常工作。

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