SML 中一个函数中的多个 if 语句

Multiple if statemens in one Function in SML

我想用 SML 编写一个函数来检查参数 abc 是否为 true,如果是,则增加值x1.02.03.0。 例如:

fun calc(a:bool, b:bool, c:bool, d:int) = 
let
    val x = 0.0
in
    if a then x+1.0 else x+0.0
    ;if b then x+2.0 else x+0.0
    ;if c then x+3.0 else x+0.0
    ;if d<120 then x+4.0 else x+0.0
end

如果我 运行 此代码带有 abc trued < 120,那么我得到输出:

val it = 0.0 : real

但我想得到输出 x

首先,在一个函数定义中有多个if表达式是没有问题的。例如,以下是没有问题的:

fun sign x = if x < 0  then ~1
            else if x = 0 then 0
            else 1;

请注意,if ... then ... else 是一个产生值的表达式,而不是控制结构。在那个 in 块中有几个独立的 if 表达式,用分号分隔。当您在这样的 in 块中有多个表达式时,它们会按顺序计算,最后一个表达式的结果是该块的总值。这仅在早期表达式有副作用时才有意义(例如,将某些内容打印到终端或使用 ref 变量修改商店)。在您的情况下,您的表达式没有副作用,您只是丢弃值(最后一个值除外)。

您似乎想要一系列的 val 绑定,其中后面的绑定依赖于前面的绑定。这可以做到,但它需要在构造的 let 部分而不是 in 部分。类似于:

fun calc(a:bool, b:bool, c:bool, d:int) = 
let
    val x = 0.0
    val x = if a then x+1.0 else x
    val x = if b then x+2.0 else x
    val x = if c then x+3.0 else x
in
    if d<120 then x+4.0 else x
end

例如:

- calc(false,false,true,119);
val it = 7.0 : real

您可以通过编写辅助函数更直接地做到这一点:

fun f(a,x) = if a then x else 0.0;

然后:

fun calc(a,b,c,d) =  
let
   val x = f(a,1.0) + f(b,2.0) + f(c,3.0)
in
   if d < 120 then x + 4.0 else x
end