私は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)
助言がありますか?
完全なエラーメッセージはerror: not found: value abs
。値「abs」が見つかりません。あなたが欲しいmath.abs
。または、import math._
これらの数学関数が必要になる前のどこか。
私はあなたと同じ問題を抱えていました。 absがコードで定義されているため、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
そして、冗長なコードなしの最も簡単な方法:
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)
}