【问题标题】:Ocaml nested if without elseOcaml 嵌套 if 没有 else
【发布时间】:2015-06-04 00:38:50
【问题描述】:

如果没有 else 语句是否可以嵌套。我编写了以下无用的程序来演示嵌套 if。我该如何解决这个问题,使其在语法方面是正确的。第 5 行和第 6 行给出了错误。

let rec move_helper b sz r = match b with
    [] -> r
    |(h :: t) ->
        if h = 0 then
            if h - 1 = sz then h - 1 ::r
            if h + 1 = sz then h + 1 ::r
        else move_helper t sz r
;;

let move_pos b = 
    move_helper b 3 r
;;

let g = move_pos [0;8;7;6;5;4;3;2;1]

【问题讨论】:

  • 如果你没有演示嵌套 ifs,你可以匹配 (h, h-sz) - 在实际代码中,不要使用嵌套 ifs 作为模式匹配或相互递归函数做很多 更好地构建程序。

标签: recursion ocaml


【解决方案1】:

你不能没有if 而没有else,除非表达式的结果是unit 类型。您的代码不是这种情况,因此不可能。

这是一个结果为unit的示例:

let f x =
    if x land 1 <> 0 then print_string "1";
    if x land 2 <> 0 then print_string "2";
    if x land 4 <> 0 then print_string "4"

【讨论】:

  • 我尝试用 ();早些时候,但后来我在第 7 行收到语法错误(否则递归调用)
  • 嗯,这是一个不同的问题。一般来说,在混合嵌套的ifs 和let 时需要注意括号。这就是我的经验。但是您的代码读起来像命令式代码。这是我怀疑的第一个障碍。
  • 我删除了命令式代码并将其替换为递归函数。唯一的缺点是一个额外的功能和额外的代码。现在可以正常使用了。
【解决方案2】:

您必须了解if ... then 是一个和其他任何表达式一样的表达式。如果不存在else,则必须将其理解为if ... then ... else (),因此具有类型unit。为了强调它是一个表达式这一事实,假设您有两个函数fg,类型为int → int。你可以写

(if test then f else g) 1

您还必须了解x :: r 根本不会改变r,它构造了一个新列表,将x 放在r 前面(此列表的尾部是共享的与列表r)。在您的情况下,逻辑不清楚:h=0 但两个if 失败时的结果是什么?

let rec move_helper b sz r = match b with
  | [] -> r
  | h :: t ->
     if h = 0 then
       if h - 1 = sz then (h - 1) :: r
       else if h + 1 = sz then (h + 1) :: r
       else (* What do you want to return here? *)
     else move_helper t sz r

【讨论】:

    【解决方案3】:

    当你有一个 if 时,总是放一个 else。因为当你不放 else 时,Java 将不知道 case 是真还是假。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 2021-07-27
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多