我想在SML中编写一个函数来检查参数a
,b
,c
是否为true
,如果是,则增加值{{ 1}} x
,1.0
或2.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
,a
和b
c
以及true
运行此代码,那么我会得到输出:
d < 120
但我希望得到输出val it = 0.0 : real
。
答案 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