【问题标题】:Scala Type mismatch, expected: List[NotInferedA], actual: List[Int]Scala 类型不匹配,预期:List[NotInferedA],实际:List[Int]
【发布时间】:2019-12-27 19:34:45
【问题描述】:

我正在尝试在 Scala 工作表中执行这段代码(使用 Intellij):

我使用的 Scala 版本是 2.11.12

sealed trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]

def tail[A](l: List[A]): List[A] =
  l match {
    case Nil => sys.error("tail of empty list")
    case Cons(_, t) => t
  }

val a = List(1,2,3)
tail(a) //should be List(2,3)

编译器给了我一个'类型不匹配,预期:List[NotInferedA],实际:List[Int]。

有人可以帮助我吗? 谢谢

【问题讨论】:

  • 问题是您将自己的 List 与 Scala 的 List 结合起来,特别是这个val a = List(1,2,3) 是 Scala 的 List。我的建议是使用不同的名称,例如 MyListMyNil 等。此外,您不能将 Lists 的实例创建为 MyList(1, 2, 3),因为未定义该方法。您可以创建它,或者只是将您的列表构造为MyCons(1, MyCons(2, MyCons(3, MyNil))),或者,您可以创建一个类似于:: 的运算符,使其更美观,如1 :: 2 :: 3 :: MyNil

标签: scala type-mismatch


【解决方案1】:

您的 List 类缺少伴随对象。调用 List(1,2,3) 会构造一个默认的 Scala List,而不是您的列表。

您需要添加类似这样的内容(将??? 替换为真正的构造函数功能,可能使用一些递归函数):

object List {
  def apply[A](s: A*) = ???
}

【讨论】:

    猜你喜欢
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 2012-08-29
    相关资源
    最近更新 更多