海野秀之(うんのひでゆき)の外部記憶
Twitter (twilog) / RSS / アンテナ / ぶくま
ようやく、State Monad (書いたことないので)恐怖症を克服し、munchExp を State Monad として書き始めた。やっぱこうだよな。適切なツールをつかってる実感というか、快適な感じ。
ただ、書いて、寝てみて、もっとうまく書けるよなと思った(寝ながら)。
munchExp (T.STR s) =
state $ \st ->
let
insts = get_insts st
temp = get_temp st
(t, temp') = Temp.newTemp temp
inst = A.strInstr s [t]
in
(t, st{get_insts=insts ++ [inst], get_temp=temp'})
これは、次のように書き直したい:
munchExp (T.STR s) =
do
t <- newTemp
emit $ A.strInstr s [t]
return t
こう書けるように、newTemp :: State CgenState Temp.Temp や、emit :: State CgenState () を書くのだろう。"emit" という単語は、Tiger book がそういうボキャブラリなので。(状態の型も名前を変えよう> CgenState)
これで、より State Monad っぽい書き方になったかなぁとは思うんだけど…。聞くところによると、「do 記法は有害だから使うな」という説もあるらしいのが、ちょっとだけ気になってる。
ま、いいか。