■
,j;;;;;j,. ---一、 ` ―--‐、_ l;;;;;; {;;;;;;ゝ T辷iフ i f'辷jァ !i;;;;; Haskell使ったら負けかな ヾ;;;ハ ノ .::!lリ;;r゙ `Z;i 〈.,_..,. ノ;;;;;;;;> そんなふうに考えていた時期が ,;ぇハ、 、_,.ー-、_',. ,f゙: Y;;f 俺にもありました ~''戈ヽ `二´ r'´:::. `!
今までMonadといえば、「半群とモノイド。単位元あるのはどっち?」という混同しがちな質問に間違えないというくらいのメリットしかなかったんだけど、そろそろ次のステップに進むべきだとか。あと、どういうわけか、私の読む論文は、著者がSchemerかHaskellerのどっちかにほぼ二分されてるので(MLerは何故かいない)、Haskellを知っとくと色々役立ちそう。というわけで、今日からHaskellを使うことに。当面の目標は、"monadic semantics for R5RS"を書き下して、意味論解釈器で走らせるみたいな感じ。Haskell得意な人なら、数時間でできてしまうんじゃないかと思うけど。
とりあえず、bind演算(>>=)って分かりづらいなー。Kleisli Tripleに合わせるなら、型は" m a -> (a -> m b) -> m b"でなく、"(a -> m b) -> m a -> m b"であるべきなんじゃないかと思うんだけど。あとまあ、computational lambdaの方で見ると、bind演算子はletに対応するんだから
getChar >>= (\c -> putChar c)
の代わりに
--動かないコード let c <- getChar in putChar c
みたいな記法を許して欲しいなー、とか。do記法とかいらないよ、そんなの。うーん、こうとか?
let c = getChar in c >>= putChar
bind演算子の型が、"(a -> m b) -> m a -> m b"だったら、"putChar>>=c"と書けて、まだしもハッピーだったと思うんだ。それでも、これだと
--動かないコード。自然なindentが分からない・・・ let c <- getChar in if c == '\n' then putChar '0' else putChar c
みたいなことができなくなるしなー。そもそも、bindという名前がいけてない。monadic applyとかいう名前にしとけばいいのに。長いけど。"apply::(Monad m)=>(a -> m b) -> m a -> m b"の方が自然だし、普通のapplyはtrivialなMonad(つまり、m a = a)の場合と解釈すればいい。あと、
getChar >>= putChar
は、なんであかんの?ダメではないらしい。どういうわけか、ghci上で、上のコマンドを直接打つと失敗する。一回、mainとかに束縛して呼び出せばOK(2006/10/12記)
Haskellは右も左も前後も分からんので、とりあえず、噂のParsecとかで、S式パーサでも書いてみればいいのかね。semanticsの方は、多分、"A monadic semantics for core curry"とか参考にすれば、何とかなるだろう