haskell-ja > Archives > 2012/11/03

2012/11/03 09:22:21 UTC[1..100]>>=pen
#
type St a = State -> (a,State) にすると instance Show (St a) where ... が ghci で「」
#
「All instance types must be of the form (T t1 ... tn)」というエラーになりますね。
#
eval の件はそうだと私も思います。前見たときには気が付かなかった。
2012/11/03 10:33:59 UTCnobsun
#
p.328の件ご指摘どおり間違いです.ありがとうございます.原書のこの間違いは認識していてどこかで修正したはずなんだけどなぁ.
2012/11/03 11:13:21 UTCnobsun
#
commitメールを検索すると,原書の誤りをメモしたファイルには記録されているけど,本文に反映していないようだなぁ.orz
2012/11/03 12:24:22 UTCJuppa
#
教えていただけますか?
そのp.328の
  do x <- evalEx t
     y <- evalEx u
において、どこかの部分項tの評価が
evalEx t = raise"division by zero" になったとき、それはどんな経過で
最上位にまで伝わるのでしょうか? 
私のような初学者には、x <- raise"division by zero" になってしまう
ように見えるのですが。「何ページを読め」でも結構です。
2012/11/03 12:29:08 UTCnobsun
#
x <- raise "division by zero" ではまずいと思われたのはなぜでしょうか.
2012/11/03 12:33:29 UTCnobsun
#
なるほど.私の質問はよくない質問ですね.
2012/11/03 12:35:15 UTCJuppa
#
そうすると、
  return ((raise "division by zero") div y)
が実行?されることになりませんか?
2012/11/03 12:36:38 UTCnobsun
#
x <- raise "division by zero" は x = raise "division by zero" という意味ではありません.
#
do式の構文を>>=演算子の式に展開して考えた方がわかりやすいかもしれませんね.
2012/11/03 12:45:45 UTCJuppa
#
ヒントをありがとうございます。
もう少し考えてみます。
2012/11/03 12:52:47 UTCnobsun
#
evalEx (Con x) = Return x
evalEx (Div t u) = evalEx t >>= (\ x ->
                   evalEx u >>= (\ y ->
                   if y == 0 then raise "division by zero"
                   else return (x `div` y)))
#
do式の構文を展開するとこうなります.
#
instance宣言では Exc 上の >>= は
#
(Raise e)  >>= q = Raise e
  (Return x) >>= q = q x
#
のように定義されていますね.
#
だから,最初の evalEx t が (Raise "division by zero")になれば,eval (Div t u)は (Raise "division by zero")になりますよね.
#
つまり return (x `div` y) のところまでは到達しないんですよ.
2012/11/03 13:05:41 UTCJuppa
#
わかりました。
ご丁寧にありがとうございます。