我刚刚开始使用Scala,所以请原谅,如果事实证明这是愚蠢的。
我正在尝试在Scala中实现链接列表。所以,我创建了一个包含MyList类的文件和MyList.scala
中的其他类:
abstract class MyList[+A] {
def head : A
def tail : MyList[A]
def isEmpty : Boolean
def add[B>:A](element: B) : MyList[B] = new MyNonEmptyList[B](element,this)
}
object MyEmptyList extends MyList[Nothing]{
override def head: Nothing = throw new NoSuchElementException("Head of an Empty list : ")
override def tail: MyList[Nothing] = throw new NoSuchElementException("Tail of an Empty list!" )
override def isEmpty: Boolean = true
override def toString : String = ""
}
case class MyNonEmptyList[A] (head: A, tail:MyList[A]) extends MyList[A]{
override def isEmpty: Boolean = false
override def toString : String = head + ", " + tail.toString
}
在划出基本功能后,是时候进行测试了。所以,我创建了一个scala工作表test.sc
:
object test{
val list = MyNonEmptyList(1,MyEmptyList)
val b = list.head
}
现在,当我尝试运行代码时(在IntelliJ上),我收到以下错误:
Error:(1, 18) not found: value MyNonEmptyList
lazy val list = MyNonEmptyList(1,MyEmptyList)
^
我不明白这个错误背后的原因。当我按住Ctrl +单击时,我被重定向到MyList.scala文件中的源。
答案 0 :(得分:1)
我发现您的代码没有任何问题。在scala REPL上尝试代码:
scala> :paste
// Entering paste mode (ctrl-D to finish)
abstract class MyList[+A] {
def head : A
def tail : MyList[A]
def isEmpty : Boolean
def add[B>:A](element: B) : MyList[B] = new MyNonEmptyList[B](element,this)
}
object MyEmptyList extends MyList[Nothing]{
override def head: Nothing = throw new NoSuchElementException("Head of an Empty list : ")
override def tail: MyList[Nothing] = throw new NoSuchElementException("Tail of an Empty list!" )
override def isEmpty: Boolean = true
override def toString : String = ""
}
case class MyNonEmptyList[A] (head: A, tail:MyList[A]) extends MyList[A]{
override def isEmpty: Boolean = false
override def toString : String = head + ", " + tail.toString
}
// Exiting paste mode, now interpreting.
defined class MyList
defined object MyEmptyList
defined class MyNonEmptyList
scala> val x = MyNonEmptyList(1, MyEmptyList)
x: MyNonEmptyList[Int] = 1,
scala> x.head
res0: Int = 1
因此,我能想到的这个错误的唯一原因可能是您的test.sc
无法正确导入MyList.scala
。你能仔细检查一下你的#import
吗?
答案 1 :(得分:0)
正确的方法是:
工作表的目的是进行REPL操作,而不是测试你的src文件。
答案 2 :(得分:0)
您的班级可能在默认包裹内。您应该创建一个新包并将该类移动到新包。 并导入该类以使用它
import com.testpackage.{MyEmptyList, MyNonEmptyList}
val list = MyNonEmptyList(1, MyEmptyList)
val b = list.head
您无法在默认包中导入该类。
希望这有帮助!