在scala中作为Map的值

时间:2017-04-15 00:06:18

标签: scala dictionary

我正在尝试在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?

2 个答案:

答案 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))