2012-04-19 10 views
4

今日は、あなたがこのOCamlの再帰関数リファレンス?

val tempFunc = ref (fn k:int => true); 
fun even x = if x = 0 then true else !tempFunc(x-1); 
fun odd x = if x = 0 then false else even(x-1); 
tempFunc := odd; 

のようなものを持っていると私は途方もなく似ているのOCamlで働いているが、私はちょうど同じことをやってのトラブル種類を抱えているところSMLに「結び目を作る」について学びましたもの。私はそれを発見した事は、最も近い

let tempFunc {contents =x}=x;; 

ですが、私は本当にそれを理解していないで、と私は別の関数にtempFuncことを結びつけることができますか。どんな助けもありがとう!

答えて

9

のOCamlであなたのコードの直接の翻訳がある:

let rec even x = if x = 0 then true else odd (x-1) 
and  odd x = if x = 0 then false else even (x-1) 
+0

( 'と'はSMLでも慣用句になります)これはあくまでも結び目の結びつきのアイデアを示す例です。 –

+0

私は前にそれを試してみたが、何かを逃したに違いない、 どうもありがとう! – joebro

4

:この(それは同様SMLであるとして)再帰関数を使用することですを行うため

let tempFunc = ref (fun k -> true) 
let even x = if x = 0 then true else !tempFunc (x-1) 
let odd x = if x = 0 then false else even (x-1) 
let() = tempFunc := odd 

慣用的な方法同等のOCamlコードは

let tempFunc = ref (fun (k: int) -> true);; 

let even x = if x = 0 then true else !tempFunc (x-1);; 

let odd x = if x = 0 then false else even (x-1);; 

tempFunc := odd;; 

です。これは、SMLコードと事実上同じです。

(追加する編集:実際には、トーマスのコードが少しきれいです!)を使用して参照することなく、同じものを持っている別の方法があり

1

:このコードは無防備伴うこと

let rec even_helper f x = if x = 0 then true else f even_helper (x-1);; 
let rec odd_helper f x = if x = 0 then false else f odd_helper (x-1);; 
let even = even_helper odd_helper;; 
let odd = odd_helper even_helper;; 

注再帰型:ヘルパーのタイプは('a -> int -> bool) -> int -> bool as 'aです。つまり、ヘルパーの最初の引数は、最初の引数がヘルパーである関数です。このような型はOcamlによって受け入れられますが、コンパイラに-rectypesオプションを渡した場合に限ります。

さらに多くの機能を使用すると、recをすべて削除することができます。これはあなたの質問に対する直接的な答えではなく、パターンが純粋に機能的な仕方でどのように見えるかを示すサイドトラックです。

+0

(これはうまくいきません) –

+1

@JeffreyScofieldはい、そうですが、あなたは '-rectypes'が必要です。 – Gilles

+0

アハ - 優れています。 –