【问题标题】:Modifying the list class修改列表类
【发布时间】:2016-10-28 15:53:56
【问题描述】:

我正在研究 Scala 中的函数式编程,前几章定义了这种类型的数据结构:

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

当我尝试像这样定义一个链表时;它按预期工作:

val nums: List[Int] = Cons(1, Cons(2, Cons(3, Nil)));

然而,我试图定义这样的链表,但出现编译错误(scala.collection.immutable.List[Int] 类型的表达式不符合预期的 List[Int] 类型:

val nums: List[Int] = List[Int](1, 2, 3)

我的问题是 - 1) 声明数据结构会修改 List 的内部类吗? 2)为什么不能使用第二种结构?

【问题讨论】:

    标签: scala functional-programming


    【解决方案1】:

    1) 声明数据结构是否会修改List的内部类?

    没有。

    2) 为什么不能使用第二种结构?

    您正在调用List 对象的apply 方法。范围内唯一名为List 的对象是scala.collection.immutable.List objectits apply method 返回scala.collection.immutable.List 的实例。但是,您已将 nums 声明为 List[Int] 类型,而不是 scala.collection.immutable.List[Int],因此这两种类型不兼容。

    您需要编写自己的List 对象,例如这样:

    object List {
      def apply[A](elements: A*): List[A] = 
        if (elements.isEmpty) Nil else Cons(elements.head, apply(elements.tail :_*))
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-04
      • 2021-01-30
      • 2016-10-26
      • 1970-01-01
      • 2018-08-29
      相关资源
      最近更新 更多