如何在我的过滤器中应用条件

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 "    "