「駄目日記/2006年04月20日/モナド3点セット(M,ext,unit)のHaskell対応の訂正」の編集履歴(バックアップ)一覧はこちら
「駄目日記/2006年04月20日/モナド3点セット(M,ext,unit)のHaskell対応の訂正」(2006/04/20 (木) 12:21:43) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
#blognavi
[[モナド入門」への補足とか応答とか>http://d.hatena.ne.jp/m-hiyama/20060420/1145496419]]
で[[昨日のエントリ>http://www3.atwiki.jp/nanakoso/pages/10.html]]
をせっかく紹介していただいたんだけど
あとで間違いに気づいてしまいました。
追記:このエントリの内容はすでに檜山さんの[[モナドの定義とか>http://d.hatena.ne.jp/m-hiyama/20060418/1145322223]]に書かれておりました。こちらのほうが断然正確で網羅的です。orz
昨日、extは
liftMだよ、、て言っちゃったけど
コレは間違い。
liftM っちゅうのは関数の出入り口をどっちもモナド形で拡張してしまう。
Haskell風の型式でかくと
liftM :: (a -> b) -> (M a -> M b)
で檜山さんがいってた ext はよく読むと
> fun:T→Countup(S)という関数から
> ext(fun):Countup(T)→Countup(S)
> という関数を作り出す関数(高階関数)であるext
つまり
ext :: (a -> M b) -> (M a -> M b)
で、結局、直接に接対応する関数がみつかりませんですた。
(知らないだけかも。Haskellの偉い人の突っ込みお待ちしております)
で、無理やり対応付けてみた。
ext = \f -> join.(liftM f)
ここででてきたjoinて関数ってのは
join :: M ( M a ) -> M a
つまり檜山さんのCounterの例でいうと
入れ子になったモナド
{ value: { value:ほげ, counter:5 } , counter:5 }
を
{ value:ほげ, counter:10 }
にしてくれる関数。
liftM に (a -> M b)な関数 f を適用させると
(M a -> M(M b) )になっちゃうから
joinでつじつまを合わせてる感じ。
#むむ、joinてCounterMainの代わりに使えそう。
#ひょっとしてjoinてそういう用途なのか。
理屈だけじゃなくてIOモナドでちょっと実験。
---- aa.hsで下記をセーブ
module Main where
import Monad
ext :: Monad m => (a -> m b) -> (m a -> m b)
ext = \f -> join.(liftM f)
-- (>>=) と同じものをextで作ってみる。
(>>==) :: Monad m => m a -> (a -> m b) -> m b
m >>== f = (ext f) $ m
-- (>>=)の代わりに動くかな?
main = getLine >>== putStrLn
Hugsで実行。
Main> :l aa.hs
Main> main
abc ←キー入力
abc ←出た!
成功!
#right{
カテゴリ: [[[プログラミング>駄目日記/カテゴリ/プログラミング]]] - &trackback() - 2006年04月20日 12:16:54
}
#blognavi
#blognavi
[[モナド入門」への補足とか応答とか>http://d.hatena.ne.jp/m-hiyama/20060420/1145496419]]
で[[昨日のエントリ>http://www3.atwiki.jp/nanakoso/pages/10.html]]
をせっかく紹介していただいたんだけど
あとで間違いに気づいてしまいました。
追記:このエントリの内容はすでに檜山さんの[[モナドの定義とか>http://d.hatena.ne.jp/m-hiyama/20060418/1145322223]]に書かれておりました。こちらのほうが断然正確で網羅的です。orz
昨日、extは
liftMだよ、、て言っちゃったけど
コレは間違い。
liftM っちゅうのは関数の出入り口をどっちもモナド形で拡張してしまう。
Haskell風の型式でかくと
liftM :: (a -> b) -> (M a -> M b)
で檜山さんがいってた ext はよく読むと
> fun:T→Countup(S)という関数から
> ext(fun):Countup(T)→Countup(S)
> という関数を作り出す関数(高階関数)であるext
つまり
ext :: (a -> M b) -> (M a -> M b)
で、結局、直接に接対応する関数がみつかりませんですた。
(知らないだけかも。Haskellの偉い人の突っ込みお待ちしております)
追記2:[[見つかりました>http://www3.atwiki.jp/nanakoso/pages/15.html]]
で、無理やり対応付けてみた。
ext = \f -> join.(liftM f)
ここででてきたjoinて関数ってのは
join :: M ( M a ) -> M a
つまり檜山さんのCounterの例でいうと
入れ子になったモナド
{ value: { value:ほげ, counter:5 } , counter:5 }
を
{ value:ほげ, counter:10 }
にしてくれる関数。
liftM に (a -> M b)な関数 f を適用させると
(M a -> M(M b) )になっちゃうから
joinでつじつまを合わせてる感じ。
#むむ、joinてCounterMainの代わりに使えそう。
#ひょっとしてjoinてそういう用途なのか。
理屈だけじゃなくてIOモナドでちょっと実験。
---- aa.hsで下記をセーブ
module Main where
import Monad
ext :: Monad m => (a -> m b) -> (m a -> m b)
ext = \f -> join.(liftM f)
-- (>>=) と同じものをextで作ってみる。
(>>==) :: Monad m => m a -> (a -> m b) -> m b
m >>== f = (ext f) $ m
-- (>>=)の代わりに動くかな?
main = getLine >>== putStrLn
Hugsで実行。
Main> :l aa.hs
Main> main
abc ←キー入力
abc ←出た!
成功!
#right{
カテゴリ: [[[プログラミング>駄目日記/カテゴリ/プログラミング]]] - &trackback() - 2006年04月20日 12:16:54
}
#blognavi
表示オプション
横に並べて表示:
変化行の前後のみ表示: