【问题标题】:Why Scala REPL shows tuple type for Map expression?为什么 Scala REPL 显示 Map 表达式的元组类型?
【发布时间】:2013-03-14 05:40:21
【问题描述】:

Scala REPL 为这两个表达式提供了相同的类型——(元组?——奇怪!)。然而("a" ->1) 这是我可以添加到地图的地图,而("a", 1)不能。为什么 Scala REPL 显示 Map 表达式的元组类型类型?

scala> :t ("a" -> 1)
(String, Int)

scala> :t ("a",1)
(String, Int)

scala> val m = Map.empty[String, Int]
m: scala.collection.immutable.Map[String,Int] = Map()

scala> m + ("a",1)
<console>:9: error: type mismatch;
 found   : String("a")
 required: (String, ?)
          m + ("a",1)
           ^

scala> m + ("a" ->1)
res19: scala.collection.immutable.Map[String,Int] = Map(a -> 1)

【问题讨论】:

    标签: scala map tuples read-eval-print-loop


    【解决方案1】:

    实际上,这样做的原因是 Predef:http://www.scala-lang.org/api/current/index.html#scala.Predef$(在 Scala 中始终处于范围内)包含从 Any 到 ArrowAssoc 的隐式转换(方法 implicit def any2ArrowAssoc[A](x: A): ArrowAssoc[A]

    ArrowAssoc 包含方法 -> 将其转换为元组。

    所以基本上你在做any2ArrowAssoc("a").-&gt;(1),它返回 ("a",1)。

    来自repl:

    any2ArrowAssoc("a").->(1)
    res1: (java.lang.String, Int) = (a,1)
    

    此外,您可以像这样处理不可变哈希图:

    val x = HashMap[Int,String](1 -> "One")
    x: scala.collection.immutable.HashMap[Int,String] = Map((1,One))
    val y = x ++ HashMap[Int,String](2 -> "Two")
    y: scala.collection.immutable.Map[Int,String] = Map((1,One), (2,Two))
    val z = x + (3 -> "Three")
    z: scala.collection.immutable.HashMap[Int,String] = Map((1,One), (3,Three))
    

    【讨论】:

      【解决方案2】:

      Scala 认为 a + (b,c) 意味着您正在尝试使用两个参数调用 + 方法,这是一个真正的可能性,因为地图 do 具有多参数添加方法,因此您可以执行操作喜欢

      m + (("a" -> 1), ("b" -> 2))
      

      解决方案很简单:只需添加一组额外的括号,就可以清楚地看到(b,c) 实际上是作为单个参数传递的元组。

      m + (("a", 1))
      

      【讨论】:

      • 谢谢,我得到了你关于添加元组的解释!问题的另一部分仍然存在 - 关于将地图添加到地图。我明白写那个表达式("a" -&gt; 1 ) 有一个 Map 类型吗?我也无法在地图文档中找到用于添加地图的方法定义。事实上 doc 只有两个 + 方法都用于添加元组:def +(kvs: (A, B)*): Map[A, B] [use case] Adds key/value pairs to this map, returning a new map. abstract def +(kv: (A, B)): Map[A, B] [use case] Adds a key/value pair to this map, returning a new map.
      • 查看我的答案:)
      • Rex Kerr,@Felix,感谢您的精彩解释!我学习 Scala 越多,我就越失望((看起来 Scala 是“最令人惊讶”的语言,而不是“最不惊讶”的语言。我研究 Scala 的次数越多,我就越重视 Haskell 的美丽和清晰!
      • @AntonAshanin - 那些你知道的怪癖的语言通常看起来不像你第一次遇到的那些怪癖的语言那么令人惊讶。我提出的假设与您不同,并且根本没有发现这种行为令人惊讶。不过,我同意 Haskell 是一种特别优雅的语言。
      • Haskell 也不同,因为它纯粹是功能性的,并不存在于 JVM 上。 Scala 在某些方面也很优雅,因为它的语法非常灵活。
      猜你喜欢
      • 2012-03-03
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      相关资源
      最近更新 更多