Подтвердить что ты не робот

Scala - ошибка: не найден: значение

Я недавно на scala и попытался пропустить легкий лист scala.

IDE - это версия сообщества Intellij IDEA и OS Ubuntu 12.04, sbt установлена ​​правильно.

Но он выдает ошибку - error: not found: value

OI не может понять, почему это происходит:

Код:

object session {
  1 + 2
  def abs(x: Double) = if (x < 0) -x else x         <== update this line
  def sqrtIter(guess: Double, x: Double): Double =
    if (isGoodEnough(guess, x)) guess
    else sqrtIter(improve(guess, x), x)

  def isGoodEnough(guess: Double, x: Double) =
    abs(guess * guess - x) < 0.001

  def improve(guess: Double, x: Double) =
    (guess + x / guess) / 2
  def sqrt(x: Double) = sqrtIter(1.0, x)
  sqrt(2)
  sqrt(4)
}

Вывод с правой стороны экрана:

> res0: Int = 3

> <console>:8: error: not found: value isGoodEnough
             if (isGoodEnough(guess, x)) guess else sqrtIter(improve(guess, x), x)  
                 ^
  <console>:8: error: not found: value improve
             if (isGoodEnough(guess, x)) guess else sqrtIter(improve(guess, x), x)  
                                                             ^
> <console>:8: error: not found: value abs
             abs(guess * guess - x) < 0.001
             ^
> improve: (guess: Double, x: Double)Double

> <console>:7: error: not found: value sqrtIter
         def sqrt(x: Double) = sqrtIter(1.0, x)
                               ^    
> <console>:8: error: not found: value sqrt
                sqrt(2)
                ^

> <console>:8: error: not found: value sqrt
                sqrt(4)

Любые предложения?

4b9b3361

Ответ 1

Полное сообщение об ошибке error: not found: value abs. Значение "abs" не найдено. Вы хотите math.abs. В качестве альтернативы вы можете добавить import math._ где-нибудь, прежде чем вам понадобятся эти математические функции.

Ответ 2

У меня была такая же проблема, как и вы. Я не думал, что импортирование math.abs или импорт math._ были действительными, поскольку абс был определен в коде.

Для меня работала реорганизация порядка определений функций. Вы должны определить что-то выше, прежде чем его можно будет использовать ниже.

object session {
  def abs(x: Double) = if (x<0) - x else x

  def isGoodEnough(guess: Double, x: Double) =
  abs(guess * guess - x) < 0.001

  def improve(guess: Double, x: Double) =
    (guess + x / guess) / 2
  def sqrtIter(guess: Double, x: Double): Double =
    if(isGoodEnough(guess, x)) guess
    else sqrtIter(improve(guess, x), x)


  def sqrt(x: Double) = { sqrtIter(1.0, x) }

  sqrt(2)
  sqrt(4)
}

Возвращается:

> abs: (x: Double)Double


> isGoodEnough: (guess: Double, x: Double)Boolean


> improve: (guess: Double, x: Double)Double


> sqrtIter: (guess: Double, x: Double)Double


> sqrt: (x: Double)Double



> res0: Double = 1.4142156862745097
> res1: Double = 2.0000000929222947

Ответ 3

И самый простой способ без избыточного кода:

object session {
  1 + 2
  def abs(x: Double) = if (x < 0) -x else x
  def sqrt(x: Double) = {

  def sqrtIter(guess: Double): Double =
    if (isGoodEnough(guess)) guess
    else sqrtIter(improve(guess))

  def isGoodEnough(guess: Double) =
    abs(guess * guess - x) / x < 0.001

  def improve(guess: Double) =
    (guess + x / guess) / 2
  sqrtIter(1.0)
  }
  sqrt(2)
  sqrt(4)
  sqrt(1e-16)
  sqrt(1e60)
}