楽しいかどうかは個人に依ります。
追記:4.02.1で動作確認
括弧周り
()はコンストラクタとして再定義可能、括弧括弧とかいう愉快な式が現れる!
パラメータを'a tにしてみると、なんと() ()がエラーになる。むしろ上の例でナンデコンストラクタの引数部分の()はunitだと思われたのかのほうが面白い。
モジュールの中でunit型のエイリアスを作ってみると、M.()で取り出せない!M.(())と書く必要がある!ちなみにM.( expr )ではM.はローカルオープンと全く同じ意味なので下のようなヘンチクリンなプログラムが書けるのだ
コロンコロン
::はコンストラクタ。再定義可能だ!唯一の中置コンストラクタだぞー。
こんな風に木構造を作るのに使うと書きやすと思ったが全くそんなことなかった。ちなみに当然のように右結合。
ちなみにこのように::の引数部分を組みでない型にすると使えなくなる…
boolean
コンストラクタは大文字から始まる、は間違っている。true, falseは再定義可能な小文字から始まるコンストラクタだ!
ちなみに再定義しててもifの条件節ではboolだと思われている。上と同じような現象である。
おまけ
TAPL22 24章を読めばわかるエラーメッセージ
applicative generative functorにつけるカッコはただのシンボルなので()が再定義されようが全く関係ない