SML中一个函数中的多个if statemens

时间:2017-10-30 12:32:39

标签: function if-statement standards sml ml

我想在SML中编写一个函数来检查参数abc是否为true,如果是,则增加值{{ 1}} x1.02.0。 例如:

3.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 ab c以及true运行此代码,那么我会得到输出:

d < 120

但我希望得到输出val it = 0.0 : real

1 个答案:

答案 0 :(得分:2)

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

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

请注意,if ... then ... else是一个表达式,它产生一个值,而不是一个控制结构。在if块中有几个独立的in表达式,以分号分隔。当在这样的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