4

今日は、このようなものがある SML の「結び目を作る」ことについて学びました。

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で作業していますが、同じことをするのに苦労しています。私が見つけた最も近いものは

let tempFunc {contents =x}=x;;

しかし、私はそれを本当に理解していません.tempFuncを別の関数に結び付ける方法. どんな助けでも大歓迎です!

4

3 に答える 3

9

OCaml でのコードの直訳は次のとおりです。

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

これを行う慣用的な方法は (SML にもあるように)、再帰関数を使用することです。

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)
于 2012-04-19T06:27:18.453 に答える
4

同等の 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のコードとほぼ同じです。

(追加するために編集: 実際、トーマスのコードはもう少しきれいです!)

于 2012-04-19T06:28:36.677 に答える
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完全になくすことができます。これはあなたの質問に対する直接的な回答ではなく、そのパターンが純粋に機能的な方法でどのように見えるかを示すサイドトラックです。

于 2012-04-19T07:56:01.650 に答える