我试图在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
答案 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