ふつける 8,9 章

ふつける 8 章。
ラムダは \ 。これはちょっとなあ…。短すぎるというか、バックスラッシュは気持ち悪い。fn や fun ぐらいのほうが好きだなあ。でもJavaScript の function は長すぎる。OCaml にも function はあるけど、あれはあんまり使わないからいいんだっ。
関数合成は (.) で行う。SML の o だな。OCaml には無い。これ無かったらだいぶ不便だと思うのだが、入ってないのは何か意図があるんだろうか。
部分適用。二項演算子には、演算子の右側だけに引数を渡すこともできるし、左側だけに引数を渡すこともできる。OCaml ではできないが、ラベルを使うと引数を渡す順番を変えることができる。

# let f ~x ~y = x - y;;
val f : x:int -> y:int -> int = <fun>
# let g = f ~y:8;;
val g : x:int -> int = <fun>
# g 10;;
- : int = 2
# g ~x:10;;
- : int = 2
# f 20 5;;
- : int = 15
# f 20;;
Expecting function has type x:int -> y:int -> int
This argument cannot be applied without label

キーワード引数のようなものだ。普通の関数のように順番に引数を渡すこともできるが、ラベルなしで部分適用はできない。
ポイントフリースタイル。ちょっと読みにくいか。OCaml でやると value restriction でまずい場合もある。

8章はさらっと流して 9 章。
型推論、型宣言、多相型。特にふつう。
代数的データ型。data と type と newtype がある。data と type がそれぞれ SML の datatype と type に対応する。newtype は新しい型を作るということで、abstype に似ていると言えないこともない。
型クラス。アドホック多相、あるいは多重定義ができる。型クラスは継承できる。これは nominal subtyping というやつか。ん、今気付いたけど

x # y = x + y

みたいに定義できるのね。知らなかった。

とりあえず 9 章終わり。明日は 10,11 章のモジュールとモナドモナドOCaml に無いので楽しみ。