1. camlspotter
  2. ocaml-zippy-tutorial-in-japanese

Commits

camlspotter  committed d7a2905

eta

  • Participants
  • Parent commits 977b65e
  • Branches default

Comments (0)

Files changed (1)

File random_memo.rst

View file
 上の関数の型では ``?foo:int`` になっているが、 ``foo`` は定義内部では ``int option`` になる。
 
 
+
+η expansion を簡単に書く
+===============================================
+
+η expansion がわからない人はそれが何か、それが何の役に立つか勉強してください。
+Value polymorphsim とか eta expansion で検索な。
+
+次のようなコードがあったとして::
+
+    let f = very very long code so long and lots_of lines
+
+Value polymorphism restriction で十分に多相性が出ない場合、η expansion します::
+
+    let f x = very very long code so long and lots_of lines x
+
+でもこれ面倒臭い。仮引数と実引数の距離が離れているととても面倒臭い。
+これをより簡単にする方法::
+
+    let f x = x |> very very long code so long and lots_of lines
+
+``(|>)`` は::
+
+    external (|>) : 'a -> ('a -> 'b) -> 'b = "%revapply"
+
+で定義。
+
+ただ、これにも限界があって::
+
+    let f = a >>= b
+
+のような ``|>`` と強さが同じもしくは弱い演算子が存在すると、::
+
+    let f x = x |> a >>= b
+
+は::
+
+    let f x = (x |> a) >>= b
+
+のようにパースされ、上手くいかない。
+
+ちゃんとやりたければ CamlP4 を使って::
+
+    let f = eta .....
+
+が ``let f = fun x -> x |> (.....)`` に展開されるようなマクロを書けば良い。
+どうやって書くか?そりゃあんたに任せる。
+
 Ocaml と書く奴は OCaml 使わんでいい
 ============================================