web-dev-qa-db-ja.com

OCamlで `and`キーワードはどういう意味ですか?

OCamlのandキーワードに戸惑いました。 このコード を見ると、わかります

type env = {
    (* fields for a local environment described here *)
}

and genv {
    (* fields for a global environment here *)
}

次に 後で

let rec debug stack env (r, ty) = (* a function definition *)

and debugl stack env x = (* another function definition *)

何が起きてる? andキーワードは最後のtypelet、またはlet recステートメントをコピーするだけですか? and recステートメントのようなものはありますか? andまたはletと入力するだけでなく、typeを使用して、コードのリファクタリングに対する脆弱性を軽減したいのはなぜですか?他に知っておくべきことはありますか?

11
Jeff Hemphill

andキーワードは、複数のletを回避するため(最初の例、これには使用しませんが、なぜ使用しないのか)、または型、関数、モジュールの相互再帰的な定義に使用されます。

2番目の例でわかるように:

let rec debug stack env (r, ty) =
   ...
   | Tunresolved tyl -> o "intersect("; debugl stack env tyl; o ")"
   ...

 and debugl stack env x =
   ...
   | [x] -> debug stack env x
   ...

debugdebuglを呼び出し、その逆も同様です。したがって、andはそれを許可しています。

[編集]適切な例を挙げないのが面倒だったので、よく目にする例を次に示します。

 let rec is_even x =
   if x = 0 then true else is_odd (x - 1)
 and is_odd x =
   if x = 0 then false else is_even (x - 1)

(この例を見つけることができます ここ

相互再帰型の場合、構成を見つけるのは難しいですが、次のようになります このウィキペディアのページtreesforestsを次のように定義します

 type 'a tree = Empty | Node of 'a * 'a forest
 and 'a forest = Nil | Cons of 'a tree * 'a forest

例として、空のツリー、「a」というラベルの付いたシングルトンツリー、および「b」と「c」のラベルが付いた2ノードツリーで構成されるフォレストは、次のように表されます。

 let f1 = Cons (Empty, (* Empty tree *)
             Cons (Node ('a',  (* Singleton tree *)
                         Nil), (* End of the first tree *)
                   Cons (Node ('b', (* Tree composed by 'b'... *)
                               Cons (Node ('c', (* and 'c' *)
                                           Nil), 
                                     Nil)
                           ),
                         Nil (* End ot the second tree *)
                     )
               )
         );;

そして、サイズ関数(フォレスト内のノードの数を数える)は次のようになります:

let rec size_tree = function
  | Empty -> 0
  | Node (_, f) -> 1 + size_forest f
and size_forest = function
  | Nil -> 0
  | Cons (t, f) -> size_tree t + size_forest f

そして、私たちは

# size_forest f1;;
- : int = 3
17
Lhooq