如果没有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]
答案 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
。为了强调它是一个表达式,假设你有两个类型f
和g
的函数,比如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