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
キーワードは最後の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
はそれを許可しています。
[編集]適切な例を挙げないのが面倒だったので、よく目にする例を次に示します。
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)
(この例を見つけることができます ここ )
相互再帰型の場合、構成を見つけるのは難しいですが、次のようになります このウィキペディアのページtrees
とforests
を次のように定義します
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