2016-07-24 8 views
0

私は次のコードをeclipseで編集していますが、 "再帰的メソッドのループに結果の型が必要"というエラーがあります。ありがとう。eclipseはなぜ "再帰的メソッドループには結果型が必要"と不平を言っていますか?

package week2 

object exercise { 
    def factorial(n: Int): Int = { 
    def loop(acc: Int, n: Int) = 
     if (n == 0) acc 
     else loop(acc * n, n - 1) 

    loop(1, n) 
    } 

    factorial(4) 
} 

お返事ありがとうございます。はい、私はここで何かを忘れました。正しいは次のとおりです。

package week2 

object exercise { 
    def factorial(n: Int): Int = { 
    def loop(acc: Int, n: Int): Int = 
     if (n == 0) acc 
     else loop(acc * n, n - 1) 

    loop(1, n) 
    }            //> factorial: (n: Int)Int 

    factorial(4)         //> res0: Int = 24 
} 

答えて

1

任意の再帰的な方法は、戻り値の型を宣言する必要がありScalaの言語の規則。 loopは再帰的なメソッドであり、戻り値の型は宣言していません(factorialに対して宣言しているだけで、必ずしも必要ではありません)。したがって、scalac(拡張子はEclipse)は、再帰的メソッドloopに戻り型が必要であることを伝えています。

+0

お返事ありがとうございます。実際、私はコースラコースに従っています。私のコードはインストラクターのものとまったく同じです。しかし、ビデオにエラーは表示されません。だから私は構成上の問題だと思う。 – Jimmy

1

sepp2kが示すとおり、コンパイラによって制限されています。説明のためにさらに情報を追加したかっただけです。

が非再帰関数を考えてみましょうコンパイラによって推論されます彼らは体の種類に対応するのでScalaのlocal type inferenceメカニズムによる方法の

戻り値の型は、多くの場合、省略することができ

def f(n: Int) = n % 2 == 0 

コンパイラは、式を知っているので、結果の型を推論できます。は常にタイプBooleanを生成します。

しかし、あなたは、再帰関数を扱うときには、無限ループにつながることから、

def f(n: Int) = if (n == 0) 1 else n * f(n-1) 

Scalaのコンパイラのようif (x == 0) 1 else x * f(x-1)の結果の型を推論しません。が*オペレーションの対象となるオペランドであることを知ることさえできないので、エラーCannot resolve reference * with such signatureが返されます。

+0

あなたの推論は真実ではありません。一般的なケースで再帰関数の型推論を実装するのは難しくありませんが、Scalasのローカル型推論モデルには適合しないため、Scalaでは単純に行われません。 – sschaef

+0

ありがとうございます、私は答えを更新しました。 – tarashypka

関連する問題