在ocaml中,我希望每个条件都有许多嵌套的if语句和返回值。这样的代码变得越来越复杂。
let func arg1 arg2 =
if condition1 then arg1+arg2
else
(
//code1
if condition2 then arg1*arg2
else
(
//code2
if condition3 then arg1+arg2
else
(
//code3
)
)
)
我可以有这样的代码来代替这样的嵌套语句吗?
let func arg1 arg2 =
if condition1 then arg1+arg2
//code1
if condition2 then arg1*arg2
//code2
if condition3 then arg1+arg2
//code3
答案 0 :(得分:4)
如果if
语句返回类型为else
的值(基本上仅在 做某事时),则可以使用不带unit
的{{1}}语句。
if condition then print_int 3
但是,在您的情况下,您要返回类型int
的值,因此else
分支是强制性的。不过,可以使用else if
语句来缩短它。
if condition1 then arg1+arg2
else if condition2 then arg1*arg2
else if condition3 then arg1+arg2
else arg1
请注意,您需要再次在末尾使用else
。
也可以使用when
子句扩展模式匹配以验证某些条件:
match 3 with
| 0 -> 0
| 1 -> 1
| x when x mod 2 = 0 -> x/2
| x when x mod 3 = 0 -> x/3
| x -> x
答案 1 :(得分:1)
OCaml是一种强类型和静态类型的语言,这意味着每个表达式的类型都在编译时检查。
看看下面的代码片段。
if condition then true_value else false_value
在编译过程中,类型检查器将检查以下内容:
condition
必须具有类型bool
; true_value
必须与false_value
具有相同的类型; true_value
和false_value
相同。如果这些语句中的任何一个都不为真,则编译将失败并出现类型错误。
现在,让我们看一下没有if
的{{1}}语句。
else
如果条件为假,则表达式的计算结果为if condition then true_value
,这是类型()
的唯一值。使用前面的语句2和3,unit
在这里可以具有的唯一类型是true_value
。这意味着您不能将unit
或int
或其他任何内容用作string
。
通常,深度嵌套的true_value
语句被视为code smell:它可能表明您的代码需要重构。例如,OCaml提供pattern-matching。根据实际代码的样子,这可能是解决方法。
答案 2 :(得分:0)
仅供参考,您不需要所有这些括号。 else
之后的所有内容都被视为“ else”分支中的单个表达式。您可以像这样编写代码
let func arg1 arg2 =
if condition1 then arg1+arg2 else
(* code1 *)
if condition2 then arg1*arg2 else
(* code2 *)
if condition3 then arg1+arg2 else
(* code2 *)