如果没有别的话,Ocaml会嵌套

时间:2015-03-30 20:28:22

标签: recursion ocaml

如果没有else语句,是否可以嵌套?我编写了以下无用的程序来演示嵌套的ifs。我如何解决这个问题,这在语法方面是正确的。第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]

2 个答案:

答案 0 :(得分:4)

如果表达式的结果属于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"

答案 1 :(得分:1)

你必须明白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