Functional programming SML中存在冗余case语句的(初学者';s)问题
我试图用SML写一个函数来计算一个交变谐波级数的部分和,在我的一生中,我不明白为什么编译器说其中一个例子是多余的。我以前没有使用过case语句(或者本地语句),但是这些用例的顺序对我来说似乎是正确的Functional programming SML中存在冗余case语句的(初学者';s)问题,functional-programming,sml,ml,Functional Programming,Sml,Ml,我试图用SML写一个函数来计算一个交变谐波级数的部分和,在我的一生中,我不明白为什么编译器说其中一个例子是多余的。我以前没有使用过case语句(或者本地语句),但是这些用例的顺序对我来说似乎是正确的 local fun altHarmAux (x:int, y:real) = case x of 1 => 1.0 | evenP => altHarmAux(x-1, y - y/(real x)) | od
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
即使您在某个地方定义了这两个谓词函数,它们也不能用于这种情况 =>左边写的任何内容都将绑定到匹配的值,因此案例中的最后两个匹配项将匹配相同的输入,使得最后一个无效,因为第一个始终会被使用 您必须将谓词函数直接应用于值,然后匹配结果
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
或
谢谢我想除了case和local之外,我现在还需要复习pairs的用法。
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