如何在我的过滤器中应用条件
How to apply conditions in my filter
我有以下功能可以显示先前生成的迷宫的线条:
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
有一个语法错误。我如何向我的过滤器添加条件以使其工作?
那是因为
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
通常我建议使用when
guards:
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 " "
我有以下功能可以显示先前生成的迷宫的线条:
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
有一个语法错误。我如何向我的过滤器添加条件以使其工作?
那是因为
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
通常我建议使用when
guards:
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 " "