【发布时间】:2016-03-18 22:46:14
【问题描述】:
我是学习 Scala 的新手,并且正在阅读Scala 中的函数式编程一书。我在解决如何测试我的练习解决方案时遇到了一些概念和编程问题,这与如何正确调用伴随对象中定义的方法有关。
我有以下数据类型MyList,我在本书中定义了这些数据类型
sealed trait MyList[+A]
case object Nil extends MyList[Nothing]
case class Cons[+A](head: A, tail: MyList[A]) extends MyList[A]
object MyList {
def apply[A](as: A*): MyList[A] = {
if (as.isEmpty) Nil
else Cons(as.head, apply(as.tail: _*))
}
def sum(ints: MyList[Int]): Int = ints match {
case Nil => 0
case Cons(x, xs) => x + sum(xs)
}
def product(ds: MyList[Double]): Double = ds match {
case Nil => 1
case Cons(x, xs) => x * product(xs)
}
}
我想在伴生对象中测试我对 apply、sum 和 product 方法的实现。为此,我在对象定义后的文件中添加了以下几行(这些行有效)
val x = MyList(1, 2, 3, 4)
println(x)
如果我运行这些(我是命令行类型的人,所以这是一个 bash shell 会话),它似乎可以按我的预期工作
$ scala ch3-list.scala
Cons(1,Cons(2,Cons(3,Cons(4,Nil))))
但我在使用其他两个功能时遇到了问题。我尝试了以下组合
println(x.sum())
println(sum(x))
println(x.sum(x))
println(x.sum)
他们都给我错误。例如,我认为最有可能工作的x.sum() 给出了
$ scala ch3-list.scala
/Users/matthewdrury/Projects/fp-in-scala/ch3-list.scala:28: error: value sum is not a member of this.MyList[Int]
println(x.sum())
^
我是 scala 新手,也没有 java 经验,所以范围规则对我来说仍然很模糊。我想知道我在这里在概念上缺少什么,并就设置测试此类进一步方法的最佳工作流程获得一些建议。
【问题讨论】:
-
import MyList._; println(sum(x)) -
@Kolmar 那会在 repl 中,还是要添加到
.scala文件中的一行? -
将
import MyList._行“放在”调用 sum 之前。在同一个函数中,同一个对象/类中,在文件的开头等等......在 REPL 中调用导入也可以。
标签: scala