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

时间:2016-03-31 16:36:15

标签: ocaml

我有以下功能显示先前生成的迷宫的行:

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上有语法错误。如何为我的过滤器添加条件以使其有效?

2 个答案:

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