我有以下功能显示先前生成的迷宫的行:
let rec print_line_2 maze i j =
match maze.width - j with
| 0 -> ()
| _ -> match (Maze.access maze j i).doors.(1) with
| Closed -> if j < (maze.width - 1)
then Printf.printf "---+"; print_line_2 maze i (j + 1)
else Printf.printf "----"; print_line_2 maze i (j + 1);
| Opened -> if j < (maze.width - 1)
then Printf.printf " +"; print_line_2 maze i (j + 1)
else Printf.printf " "; print_line_2 maze i (j + 1);
但是我在第一个else
上有语法错误。如何为我的过滤器添加条件以使其有效?
答案 0 :(得分:1)
那是因为
if x then
a;
b;
else
c;
d;
实际上被解析为
if x then
a;
b;
else <-- error
您应该添加括号(或begin
end
,这是相同的):
if x then begin
a;
b;
end else begin
c;
d;
end
答案 1 :(得分:0)
通常,我建议使用when
警卫:
open Printf
let rec print_line_2 maze i j =
match maze.width - j with
| 0 -> ()
| _ -> match (Maze.access maze j i).doors.(1) with
| Closed when j < maze.width - 1 ->
printf "---+"; print_line_2 maze i (j + 1)
| Closed ->
printf "----"; print_line_2 maze i (j + 1)
| Opened when j < maze.width - 1 ->
printf " +"; print_line_2 maze i (j + 1)
| Opened ->
printf " "; print_line_2 maze i (j + 1)
但是看看你的代码,我看到了重复的模式,根据分支条件,只有很少的代码。看起来你错过了抽象的机会,例如:
let rec print_line_2 maze i j =
let print wall = print_string wall; print_line_2 maze i (j+1) in
if maze.width - j <> 0 then match (Maze.access maze j i).doors.(1) with
| Closed -> if j < maze.width - 1 then print "---+" else print "----"
| Opened -> if j < maze.width - 1 then print " +" else print " "