OCamlで副作用のあるライブラリを使っていて、 クロージャの(環境の)合成がしたくなったのですが失敗します 再現コードを書くと ma,mbは期待通りですがmcは毎回1が出力されます 環境の中の環境ってのは呼ばれるごとに新しい環境になるからってことですかね let a x f= let r = ref x in fun ()->Printf.printf "%d" !r;f(); r:=!r+1;; let b x f= let r = ref x in fun ()->Printf.printf "%d" !r;f(); r:=2* !r;; let c x f = fun ()->(a x (b x f))();; let ma = a 0 (fun ()->Printf.printf "a\n" );; let mb = b 1 (fun ()->Printf.printf "b\n");; let mc = c 1 (fun ()->Printf.printf "c\n");; ma();;ma();;ma();; mb();;mb();;mb();; mc();;mc();;mc();; てことはOCamlのオブジェクト指向部分ちゃんと覚えないとだめかな by poor man