(初学者)在SML中使用冗余case语句的问题

时间:2013-09-15 19:37:14

标签: functional-programming sml ml

我试图在SML中编写一个函数来计算交替谐波系列的部分和,并且对于我的生命,我无法弄清楚为什么编译器说其中一个案例是多余的。我之前没有使用过案例陈述(或就本地而言),但这些案件的顺序对我来说似乎是正确的。

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

1 个答案:

答案 0 :(得分:3)

即使您已在某处定义了两个谓词函数,也不能在这种情况下使用它们。

无论你在=>的左边写什么将绑定到您匹配的值,因此您的情况下的两个最后匹配将匹配相同的输入,使最后一个无用,因为第一个将始终使用

您必须直接将谓词函数应用于值,然后匹配结果

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