ふつける 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
みたいに定義できるのね。知らなかった。