【问题标题】:(Beginner's) issue with redundant case statement in SML(初学者)SML 中冗余 case 语句的问题
【发布时间】:2023-09-16 17:53:02
【问题描述】:

我正在尝试在 SML 中编写一个函数来计算交替谐波级数的部分和,而对于我来说,我无法弄清楚为什么编译器会说其中一种情况是多余的。我之前没有使用过 case 语句(或本地的,就此而言),但这些 case 的顺序对我来说似乎是正确的。

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

【问题讨论】:

    标签: functional-programming sml ml


    【解决方案1】:

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

    无论您在 => 的左侧写什么,都将绑定到您要匹配的值,因此您的最后两个匹配项将匹配相同的输入,使最后一个无用,因为第一个总是被使用

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

    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
    

    【讨论】:

    • 谢谢!我想我现在需要检查对的使用,除了 case 和 local。
    最近更新 更多