Scala计划中找不到的值

时间:2017-06-13 04:02:39

标签: scala intellij-idea

我刚刚开始使用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文件中的源。

3 个答案:

答案 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)

正确的方法是:

  1. 在测试目录中创建测试文件
  2. 并将您的文件正确导入到您正在执行的测试中,而不是使用工作表。
  3. 工作表的目的是进行REPL操作,而不是测试你的src文件。

答案 2 :(得分:0)

您的班级可能在默认包裹内。您应该创建一个新包并将该类移动到新包。 并导入该类以使用它

import com.testpackage.{MyEmptyList, MyNonEmptyList}

val list = MyNonEmptyList(1, MyEmptyList)

val b = list.head

您无法在默认包中导入该类。

希望这有帮助!