2017-02-01 4 views
1

私は関数を書いていて奇妙な問題があります。私は、パターンマッチングを使用して、わずかに変化はなく、ほぼ同一のパターンを使用し、コンパイルされていない、内部機能しています:ネストされた関数は、その親の戻り値の型を歪めます

def isTriangular(n: Int): Boolean = { 
    n match { 
    case n if n < 1 => false 
    case _ => triangularMaths(n, 1) 
    } 

    def triangularMaths(j:Int, counter: Int): Boolean = (j, counter) match { 
    case _ if j-counter == 0 => true 
    case _ if j-counter < 0 => false 
    case _ => triangularMaths(j-counter, counter+1) 
    } 
} 

を、このための修正プログラムは、私は単に彼らに2つの別々のメソッドを作成している、と彼らtriangularMathsがネストされていない限り動作します。ただし、triangularMathstriangularにのみ固有なので、入れ子にしたいと思います。しかし、私がこれを行うと、私のコンパイラは、BooleanではなくUnitを返すと私に言っている。これは意味をなさない。元の大括弧が解決されて真または偽を返すようになると、メソッドの最後に移動して完了する必要がありますか?修正は何ですか?

+0

ヒント:メソッドの戻り値は、メソッドで評価された最後の式の値です。ヒント#2:メソッドで評価された最後の式は何ですか?ヒント#3:関数定義の値は何ですか? –

答えて

3

これは、メソッドがスコープ内の最後の宣言であるために発生します。これにより、コンパイラは戻り値の型としてUnitの値を生成します。逆コンパイル、コードは次のようになります。

def main(args: Array[String]): Unit = { 
    def isTriangular(n: Int): Boolean = { 
    n match { 
     case (n @ _) if n.<(1) => false 
     case _ => triangularMaths(n, 1) 
    }; 
    def triangularMaths(j: Int, counter: Int): Boolean = scala.Tuple2.apply[Int, Int](j, counter) match { 
     case _ if j.-(counter).==(0) => true 
     case _ if j.-(counter).<(0) => false 
     case _ => triangularMaths(j.-(counter), counter.+(1)) 
    }; 
    () 
    }; 

まずtriangularMathsを定義し、それを呼び出す:

def isTriangular(n: Int): Boolean = { 
    def triangularMaths(j: Int, counter: Int): Boolean = (j, counter) match { 
    case _ if j - counter == 0 => true 
    case _ if j - counter < 0 => false 
    case _ => triangularMaths(j - counter, counter + 1) 
    } 

    n match { 
    case n if n < 1 => false 
    case _ => triangularMaths(n, 1) 
    } 
} 

別の可能性は値にパターンマッチを割り当てること、そして最後のように、その値を返しますメソッドの表現。しかし、それはコンパイラが前方参照について不平を言うことになり、代わりにlazy valにすることで修正することができます。私は再注文のアプローチを採用します。

+0

ああ、ありがとう。私は 'isTriangular'の最初の行にvar' b:boolean = false'を設定し、 'n match'の2行目を次のように設定しようとしました:' case _ => b == triangularMaths(n、1) '全体の閉じ括弧の直前に 'b'を返しますが、真であると評価された場合は' b'への変更を記憶しません。 – NateH06

関連する問題