2

OCaml を使用したアプリケーションの開発のこのdraw_string_in_box の例に従っています

与えられたサンプルコードは次のとおりです。

let draw_string_in_box pos str bcf col = 
 let (w, h) = Graphics.text_size str in
 let ty = bcf.y + (bcf.h-h)/2 in 
 ( match pos with 
       Center -> Graphics.moveto (bcf.x + (bcf.w-w)/2) ty 
     | Right  -> let tx = bcf.x + bcf.w - w - bcf.bw - 1 in 
                 Graphics.moveto tx ty 
     | Left   -> let tx = bcf.x + bcf.bw + 1 in Graphics.moveto tx ty  );
 Graphics.set_color col;
 Graphics.draw_string str;;

「一致」部分の括弧を削除すると、コードは機能しません (何も出力されません)。理由はありますか?

より一般的には、このようなコード ビットをいつ括弧で囲む必要がありますか?

ありがとう。

4

2 に答える 2

5

これを見る 1 つの方法->は、matchステートメントの矢印の後に、( で区切られた) 一連の式を持つことができるということです;。かっこがない場合、次の式は の最後のケースの一部のように見えますmatch

;の後に一連の式 ( で区切られた) を含めることもできますlet。括弧を使用すると、次の式は の一部のように見えますlet。これが必要です。

個人的には使用を避けて;います。それが私がこの問題に対処する方法です!それ以外の場合は、式シーケンスが、シーケンスを取る最も内側の構造と一致することを理解する必要があります。

于 2012-09-19T16:49:42.977 に答える
3

ジェフリーが説明したように、括弧を削除すると、Graphics.set_color col; Graphics.draw_string strステートメントは| Left ->ケースの一部であると理解されます。

この回答は、そのようなコードの抜粋でいつ括弧を使用するかに関するものです。ほとんどの場合、パターン マッチングは関数の最後の式です。たとえば、次のようになります。

let f x y =
  foo x;
  match y with
  | Bar -> Printf.printf "Found y=Bar!\n%!"; 42
  | Baz -> Printf.printf "Found y=Baz!\n%!"; 43

この場合、括弧は必要ありません。多くの場合、それは関数の最初の、つまり唯一の式でもあります。

let hd list = match list with
  | a :: _ -> a
  | [] -> invalid_arg "hd"

しかし、マッチングの後に何かをしたいときは、OCaml にマッチングが終了した場所を伝える必要があります。ここで括弧を使用します。

let f x y =
  foo x;
  (match y with
  | Bar -> 42
  | Baz -> 43);
  (* do something, both when y is Bar and when it is Baz: *)
  qux x y;

try ... with同じことが次のステートメントにも当てはまります。

let find_a_b a b list =
  (try print_int List.assoc a list
   with Not_found -> Printf.printf "Could not find a=%s.\n%!" a);
  (* Now do something whether or not we found a: *)
  (try print_int List.assoc b list
   with Not_found -> Printf.printf "Could not find b=%s.\n%!" b);

ここで、最初の括弧は必須で、2 番目の括弧はオプションであり、通常は書かれていません。

于 2012-09-19T21:08:39.240 に答える