1

私はそれlet recが欲しいときに使われることを知っていrecursiveます。

例えば、

let rec power i x = if i = 0 then 1.0 else x *. (power (i-1) x);;

わかりました。


しかし、これはどうですか?

let x y = y + y in x 2

rec内部で使用する必要がありますか?

内部にあるので、それ自体をロードする必要があると思いますがx 2、コンパイラーでは問題ないようです。

だから私はいつ使うべきでlet rec、使うべきではないのですか?


また、違いは何ですか

let (-) x y = y - x in 1-2-3;;

let rec (-) x y = y - x in 1-2-3;;

それらは両方とも合法ですか?

4

1 に答える 1

7

まず、OCaml のスコープ ルールを理解する必要があります。

を書くとき、 inlet f XXX = YYY in ZZZを使う場合は が必要です。どちらの場合も (つまり、 がある場合とない場合)、で定義されます。fYYYrecrecfZZZ

そう:

let x y = y + y in
x 2

完全に有効です。

2 番目の質問: いいえ、同等ではありません。トップレベルで試してみると、2 番目のステートメントは永遠にループし、 と同等let rec loop x y = loop y x in ()です。永遠にループしている理由を理解するにはloop、識別子が本体に置き換えられる拡張としての の適用を理解できます。それで:

したがって、 loopbody はfunction x y -> loop y xに展開できます function x y -> (function a b -> loop b a) y x(あいまいさを避けるためにパラメーター名を変更しました)。これはfunction x y -> loop x y、 body などを適用する場合と同等です。したがって、この関数は何もしません。本体を展開/適用し、引数を交換することで、永遠にループします。

于 2012-12-04T10:40:05.060 に答える