末尾再帰であることがわかっている関数があります。しかし、私がそれを定義する方法のために、コンパイラーは、関数が非テール位置で再帰呼び出しを行うことについて不平を言います。これが機能です。
@tailrec
def travel: (Int, List[Char]) => Int = {
case (n, Nil) => n
case (n, '~' :: sls) => travel(0, sls)
case (n, '^' :: sls) => travel(max(n-1,0), sls)
case (n, '>' :: sls) => travel(n+1, sls)
case (_, s :: sls) => throw new IllegalArgumentException("Illegal selector '" + s + "'")
}
私は得る
error: could not optimize @tailrec annotated method travel: it contains a recursive call not in tail position
def travel: (Int, List[Char]) => Int = {
このように書くとうまくいきます。
@tailrec
def travel(n:Int, l:List[Char]): Int = (n,l) match {
case (n, Nil) => n
case (n, '~' :: sls) => travel(0, sls)
case (n, '^' :: sls) => travel(max(n-1,0), sls)
case (n, '>' :: sls) => travel(n+1, sls)
case (_, s :: sls) => throw new IllegalArgumentException("Illegal selector '" + s + "'")
}
def: (Input) => Output = {}
型宣言のスタイルと関係があると思います。ネストされた一致やタプルでの一致を書き込むよりも見た目がきれいなので、これを使用します。