我正在尝试在Scala中创建lambda函数的映射
numberText.text = "\(random)"
当我输入val identity = ((x:Any) => x)
val propmap = Map("references-count" -> identity,
"title" -> ((x:List[String]) => x(0)),
"score" -> identity,
"issued" -> ((x:List[Any]) => x(0)))
或propmap("score")
时,我得到的输出是相同的:propmap("title")
。
运行<function1>
会返回预期结果。然而
identity(10.1)
结果:
val f1 = propmap("score")
f1(10.9)
看起来这个功能被覆盖了。去哪里进行besung immutabilty?
答案 0 :(得分:2)
问题是propmap的类型。
Scala将类型推断为String,(List [String] =&gt; Any)
原因是scala需要推断匹配ALL值的类型。 String作为键很明显,但对于函数,它需要找到一个匹配所有函数的函数类型。由于所有函数都有1个参数,因此这将是function1。
如果你看一下function1的定义,你会看到它是:
trait Function1[-T1, +R] extends AnyRef
这意味着它需要找到最紧缩的第一种类型。在这种情况下,这是List [String],因此它需要一个函数List [String] =&gt; Any(这实际上是有意义的,因为你想要一个可以在所有函数上使用的类型)。
因此scala会在实践中自动将您的身份函数转换为(x:List [String] =&gt; x),因此当您尝试传递一个数字时,它会失败。
可能的解决方案:
@KotWarm提到的第一个解决方案是使用asInstanceOf:
val f1 = propmap("score").asInstanceOf[Any ⇒ Any]
println(f1(10.9))
第二种解决方案是重写函数以使用Any,例如:
val propmap = Map("references-count" -> identity,
"title" -> ((x: Any) => x.asInstanceOf[List[String]](0)),
"score" -> identity,
"issued" -> ((x: Any) => x.asInstanceOf[List[Any]](0)))
答案 1 :(得分:1)
因为scalac确定了集合的类型为
propmap: scala.collection.immutable.Map [String, List [String] => Any]
明确确定集合的类型,以便编译器知道您想要获取的内容
这是一个示例代码
val identity = ((x:Any) => x)
val propmap = Map[String,_ => _]("references-count" -> identity,
"title" -> ((x:List[String]) => x(0)),
"score" -> identity,
"issued" -> ((x:List[Any]) => x(0)))
但要执行这些方法,必须转换类型
val f1 = propmap("score").asInstanceOf[Any ⇒ Any]
println(f1(10.9))