1. ホーム
  2. syntax

[解決済み] OCamlにおける`and`キーワードの意味とは?

2022-03-06 15:36:53

質問

が謎なんです。 and というキーワードがOCamlにあります。を通して見ると このコード を見ると

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 キーワードは、単に最後の type , let または let rec ステートメントを使用しますか?のようなものがあるのでしょうか? and rec ステートメントが必要ですか?なぜ and と入力するのではなく let または type リファクタリングに対して脆弱なコードにならないか?他に何か知っておくべきことはありますか?

どのように解決するのですか?

その 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
   ...

debug コール debugl であり、その逆もまた然りです。ですから and がそれを可能にしている。

[EDIT] 適切な例を挙げないのが気になったので、よく見かける例を一つ紹介します。

 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 というラベルを持つ2ノードツリー bc のように表現されます。

 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