1

交番高調波級数の部分和を計算する関数を SML で記述しようとしていますが、私の人生では、コンパイラーがケースの 1 つが冗長であると言う理由を理解できません。私は以前にケースステートメントを使用したことがありません(またはローカル、その点については)が、これらのケースの順序は正しいようです。

local
  fun altHarmAux (x:int, y:real) =
    case x of
          1      => 1.0
         | evenP => altHarmAux(x-1, y - y/(real x))
         | oddP  => altHarmAux(x-1, y + y/(real x))
in
fun altHarmonic (a:int) = altHarmAux(a, real a)
end
4

1 に答える 1

3

2 つの述語関数をどこかに定義したとしても、そのような場合は使用できません。

=> の左側に書いたものは、一致している値にバインドされます。したがって、この場合の最後の 2 つの一致は同じ入力に一致し、最初の一致が常に使用されるため、最後の一致は役に立たなくなります。

述語関数を値に直接適用してから、結果を照合する必要があります

local
  fun altHarmAux (x, y) =
    case (x, evenP x) of
         (1, _)     => 1.0
       | (_ true)   => altHarmAux(x-1, y - y/(real x))
       | (_, false) => altHarmAux(x-1, y + y/(real x))
in
fun altHarmonic a = altHarmAux(a, real a)
end

またはおそらくもっと簡単

local
  fun altHarmAux (1, _) = 1.0
    | altHarmAux (x, y) =
        altHarmAux (x-1, y + (if evenP x then ~y else y) / (real x))
in
  fun altHarmonic a = altHarmAux (a, real a)
end

また

local
  fun altHarmAux (1, _) = 1.0
    | altHarmAux (x, y) =
        if evenP x then
          altHarmAux (x-1, y - y/(real x))
        else
          altHarmAux (x-1, y + y/(real x))
in
  fun altHarmonic a = altHarmAux (a, real a)
end
于 2013-09-15T20:23:19.237 に答える