scala - 在 scala 中,在 toMap 之后添加不相关的行时编译错误消失

标签 scala

这是从 coursera 函数式编程类(class)交叉发布的,因为该论坛上的事件要少得多。

我编写了以下代码(部分内容被编辑,因为它是家庭作业):

type Occurrences = List[(Char, Int)]
def subtract(x: Occurrences, y: Occurrences): Occurrences = {
  val mx: Map[Char, Int] = x toMap
  y.foldLeft (redacted) (redacted => simple expression using updated and -)) toList
}

这会产生以下编译错误:

type mismatch; found : Map[Char,Int] required: <:<[(Char, Int), (?, ?)]

但是,如果我通过 val 语句在中间添加第三行的副本(没有 toList),错误就会消失:

type Occurrences = List[(Char, Int)]
def subtract(x: Occurrences, y: Occurrences): Occurrences = {
  val mx: Map[Char, Int] = x toMap
  val foo: Map[Char, Int] = y.foldLeft (redacted) (redacted => simple expression using updated and -))
  y.foldLeft (redacted) (redacted => simple expression using updated and -)) toList
}

我猜这与向类型检查器提供某种额外提示有关,但是有人知 Prop 体为什么会发生这种情况吗?

最佳答案

下面是一些示例以及关于为什么会发生这种情况的一些解释。

首先,工作和非工作情况:

scala> { List('a -> 1, 'b -> 2).toMap
     | println("aaa") }
aaa

scala> { List('a -> 1, 'b -> 2) toMap
     | println("aaa") }
<console>:9: error: type mismatch;
 found   : Unit
 required: <:<[(Symbol, Int),(?, ?)]
              println("aaa") }
                     ^

发生这种情况是因为语法“obj method arg”被认为是“obj.method(arg)”,“obj method\n arg”也是如此,这样参数就可以写在下一行中。通知如下:

scala> { val x = List('a -> 1, 'b -> 2) map 
     | identity
     | 
     | println(x) }
List(('a,1), ('b,2))

List('a -> 1, 'b -> 2).map(identity) 相同.

现在出现奇怪的错误消息 found : Unit, required: <:<[(Symbol, Int),(?, ?)] 。碰巧toMap实际上需要一个参数,这是它的签名:

def toMap[T, U](implicit ev: <:<[A,(T, U)]): Map[T,U] ,

但它是一个隐式参数,因此在这种情况下不需要显式提供。但是当您使用obj method \n arg时它填充方法参数的语法。在上面的非工作示例中,参数是 println其类型为 Unit ,因此编译器不接受它。

一种解决方法是有两个 \n分隔线:

scala> { List('a -> 1, 'b -> 2) toMap
     | 
     | println("aaa") }
aaa

您还可以使用;分隔线。

关于scala - 在 scala 中,在 toMap 之后添加不相关的行时编译错误消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13113327/

相关文章:

scala - 如何安全地重试 Scala Future?

eclipse - 什么是最好的 Scala 构建系统?

parsing - scala:解析器帮助

mysql - 使用 Slick/Scala 将日期和时间存储到 MySQL 中

scala - 在ElasticSearch上使用Spark的自洽和更新示例

eclipse - 在 Eclipse IDE 中包含并使用 scalaz

regex - Scala 中占位符替换正则表达式的语法是什么?

scala - 为什么在 Akka Dispatcher 上启动时 Futures 中的 Futures 会按顺序运行

java - 获取 UTC 时间并格式化,无毫秒

eclipse - 如何在 Eclipse IDE 中运行 scala BDD 测试