Scala案例类和列表

Asi*_*ake 4 scala type-inference list case-class

我对Scala完全不熟悉.现在我正在尝试将我在Standard ML中编写的解析器移植到Scala并遇到以下代码的问题:

abstract class Token
case class Zero extends Token
case class At extends Token
//...

object Tokenizer {
  def tokenize(seq : List[Char]) : List[Token] = seq match {
    case List() => error("Empty input")
    case '0' :: rest => Zero :: tokenize(rest)
    case '@' :: rest => At :: tokenize(rest)
    //...
  }  
}
Run Code Online (Sandbox Code Playgroud)

在SML中,我不必声明tokenize()方法的返回类型,但似乎Scala需要它,并且它对我提供的类型不满意(它抱怨Zero,At是无效类型,它们应该是代替Token类型).请注意,我还想在解析阶段稍后的时间点匹配令牌列表.

我在网上和stackoverflow本身做了一些搜索,看看之前是否提出了类似的问题(看起来很简单),但不知怎的,我找不到任何东西.我很确定我有一些基本错误,请随时赐教:)

The*_*heo 9

At并且Zero是类,而不是对象,所以它们本身并不是Token.您可以通过更改case classcase object:来修复代码:

case object Zero extends Token
case object At extends Token
Run Code Online (Sandbox Code Playgroud)

你需要指定函数的返回类型的原因是Scala的编译器无法弄清楚递归函数的类型,你可以在这里阅读更多:为什么Scala需要递归函数的返回类型?


ten*_*shi 8

如果你想创建新的case ZeroAtcase类实例,那么你应该使用applyfactory方法来实例化它们(或new关键字:) new Zero,就像这样(在Scala Zero()中等于Zero.apply()):

case '0' :: rest => Zero() :: tokenize(rest)
Run Code Online (Sandbox Code Playgroud)

如果你只是写Zero(而不是Zero()),那么你正在使用Zero类的伴随对象,它是由编译器自动创建的.