ふつける 10,11 章

久々にふつける。入門書を順番に読んでたのが昔の俺なんだよな。今の俺は先に unsafePerformIO なんかを見てしまうから困る。
というわけでふつける 10 章。
階層化ライブラリは面倒だなあ。Data.List て。Text.ParserCombinators.Parsrc はさすがに長い。
エクスポートするエンティティを指定するには名前だけをずらずら書く。特定のコンストラクタのみをエクスポートすることもできる。
import は OCaml でいうと open だな。import 宣言は module 宣言の直後にまとめて書かなければいけないらしい。SML では let の宣言中で open できたりして便利なのだが、そういうことはできないのだろうか。
インポートするエンティティを限定することもできる。

import Text.Regex (mkRegex, matchRegex)

これは便利そうだなー。OCaml では

include struct         
  open Printf
  let sprintf = sprintf
end

とすることで sprintf だけを include できるとどこかで見た。open はできないのだがなぜだろう。
hiding とか qualified とか as とかややこしい。

えー、11 章のモナド
モナドモナド則を満たす必要がある

(return x) >>= f   == f x
m >>= return       == m
(m >>= f) >>= g    == m >>= (\x -> f x >>= g)

…らしい。return を 1、(>>=) を × と読んでやれば直観的だ。うう、しかしそんなことがわかってもプログラムは書けないよなあ。return を cat, (>>=) を | として UNIX のシェルに見立てるのはどうか。こっちのほうがややわかりやすいかも。
Maybe モナドとか List モナドの説明が続く。ええと、return は値をモナドにラップして、(>>=) は 左辺のモナドから値を取り出して右辺の関数に渡すということか。
IO モナド。参照透明性を保ちつつきちんと順番に実行されるようになっている。
本当に参照透明性が保たれているの? とも思うが、大丈夫とのこと。

副作用とは、世界の中身を直接変えることです。しかし IO モナドの考えかたによれば入出力を実行する前の世界と実行した後の世界は別の値ですから、世界それ自体が変化したわけではありません。つまり、(少なくとも Haskell の世界では)副作用は起きていないことになります。

うーん。なんだかわかったようなわからんような。多分、参照透明性は数学的に証明できるんだろう。まあ、とりあえずモナドをどう使うかというのはわかったので OK ということにしよう。

第 3 部は読まないので(いつか読むかもしれないが)、ふつけるはこれで終わり。やさしいHaskell入門 とか モナドのすべて を読んで Parsec を読む予定。