web-dev-qa-db-fra.com

scala - erreur: introuvable: valeur

J'ai récemment à scala et essayé de passer une feuille de calcul facile scala.

IDE est Intellij IDEA édition communautaire et OS Ubuntu 12.04, sbt a été installé correctement.

Mais cela jette une erreur - error: not found: value

O je ne comprends pas pourquoi cela se produit:

Code:

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)
}

Sortie depuis le côté droit de l'écran:

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

Aucune suggestion?

18
nazar_art

Le message d'erreur complet est error: not found: value abs. La valeur "abs" n'a pas été trouvée. Tu veux math.abs. Vous pouvez également ajouter import math._ quelque part avant d'avoir besoin de ces fonctions mathématiques.

20
Shadowlands

J'ai eu le même problème que toi. Je ne pensais pas que l'importation de math.abs ou l'importation de math._ étaient valides car abs était défini dans le code.

Ce qui a fonctionné pour moi, c'était de réorganiser l'ordre des définitions des fonctions. Vous devez définir quelque chose ci-dessus avant de pouvoir l'utiliser ci-dessous.

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)
}

Revenu:

> 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
lpm_nova

Et le moyen le plus simple sans code redondant:

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)
}
0
nazar_art