if语句应该与ocaml中的else语句关联吗?

时间:2019-07-15 14:03:49

标签: if-statement return ocaml

在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

3 个答案:

答案 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

在编译过程中,类型检查器将检查以下内容:

  1. condition必须具有类型bool;
  2. true_value必须与false_value具有相同的类型;
  3. 整个表达式的类型与true_valuefalse_value相同。

如果这些语句中的任何一个都不为真,则编译将失败并出现类型错误。


现在,让我们看一下没有if的{​​{1}}语句。

else

如果条件为假,则表达式的计算结果为if condition then true_value ,这是类型()的唯一值。使用前面的语句2和3,unit在这里可以具有的唯一类型是true_value。这意味着您不能将unitint或其他任何内容用作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 *)