haskell-ja > Archives > 2012/11/05

2012/11/05 02:45:03 UTCJuppa
#
Exc Int のつもりです。
(なお、先の当方do記述の中の eval はいずれも
evalEx の間違いです)
2012/11/05 02:48:19 UTCnobsun
#
でも y == 0 というのがありますがここの意図は y :: Int ではないですか?
#
x `div` y という式も x,y :: Int を意図しているように思いますが.
2012/11/05 03:03:46 UTCJuppa
#
たしかに、y == 0 や x `div` yにおけるxやyは、
x,y :: Int で十分ですが、x <- evalEx t と
書いているのですから、x :: Exc Int なのでは
ないのでしょうか?
2012/11/05 03:08:38 UTCnobsun
#
いえ,x = evalEx t なら x :: Exc Int ですが,x <- evalEx t なら x :: Int です.
2012/11/05 05:02:38 UTCJuppa
#
x <- a は,(λx.P)a のこと、くらいの理解で
した。そうではないのですね。λ計算の少し
枠外の記法なのでしょうか?
2012/11/05 05:40:12 UTCnobsun
#
通常の関数適用では (\ x -> e ) a は let x = a in e です.
このとき関数適用の際,仮引数xを実引数aに束縛して本体部を計算します.
モナドにおける関数適用にあたるものはこれを拡張したものになっています.
Haskellの関数適用演算子の型は
($) :: (a -> b) -> a -> b
です.a -> b 型の関数を a 型の引数に適用するものです.
関数の仮引数は a 型の実引数の値に束縛されます.

モナドにおける関数適用演算子にあたるものの型は
(=<<) :: (a -> m b) -> m a -> m b
です.(>>=)の引数の順番を入れ替えたものです.(f =<< m と m >>= f は同じ値です)
a -> m b 型の関数を a 型の引数ではなく m a 型の引数に適用して
いるところに注意してください.関数の仮引数の型は a なので,
通常の関数適用の方法では,この仮引数をm a 型の実引数で束縛できません.
そこで(>>=)を定義して,拡張した関数適用に対応します.
これが x <- m の意味を決めています.つまり,x <- evalEx t の意味を
決めているのは Exc が Monad クラスのインスタンスであるという宣言で
定義した(>>=)というわけです.
2012/11/05 10:29:24 UTCJuppa
#
ご回答ありがとうございます。
未だ十分理解できたとは言えませんが(特に
「通常の関数適用の方法では」以降。勿論そ
れは私の方の問題です)、直感的には、
 x <- t
においては、
 x :: a ならば t :: m a 
でなければいけないということだと理解しま
した。
ちなみに、
p.316 上7行の
  read (n+1) = getChar >>= q
におけるqの型はもちろん
 q :: Char -> IO String
という理解でよいのですよね?
2012/11/05 10:49:44 UTCJuppa
#
ただそうすると、そこでは、それぞれの型は、
 getChar ::  IO Char
  q       ::  Char -> IO String
  r       ::  String -> IO String
となって、
 >>=     ::  ma -> (a -> mb) -> mb
とどう関係するのか(特にr)が少し混乱して
きます。
2012/11/05 12:51:08 UTCnobsun
#
r :: String -> IO String 
この r は引数としてStringを取ります.
readn n の値はIO Stringですからそのまま r に渡せません.
readn n の成果を r に引き渡すのには >>= が必要です.