#えっ。どういうこと? > 「returnの実装にまつわる変さであってモナド則1が崩れていることに由来する変さではない」
#ちがいがわからん
#return はそのままで、>>= の定義を変えるだけで、1,3 OK 2 NG にしろということ?
#ああそういうことか。同じ結果になるはずのものが、ちがう結果になることを示せということ?
#でも。。。
#2を前提としてなりたつ性質にはどんなものがあるかということか。
#それは
#do { x <- m
; y <- f x
; return y
}
と
do { x <- m
;f x
}
が同じなってくれないと嫌でしょ.ということかな.
#なんかまんまですな。
#HaHaHaの例でいうと
#sample の結果と
#sample' の結果が一致しないのはいやでしょ。
#sample = do p <- ps
q <- qs
return (p,q)
sample' = do p <- ps
fmap (\ q -> (p,q)) qs
#今私が思い出しているのは
#「モナドって何?」って聞いたら
#以前「関数適用の一般化」みたいな回答をしてくれたことありましたよね?>nobsun
#はい
#bindのこと?
#あーそうなのかな
#そのときはそっから突っ込んで考えなくて
#そのままだったんだけど
#ふむ。
#その一般化した「関数適用」ってつまり何をどうすることか?
#をreturnや(>>=)は表現してるのかしらん?と
#関数適用とは
#「これこれこういうことである」
#それを支えるには「こういう性質」が絶対
#というのがモナド則なのかと。
#関数適用はβリダクションのこと
#βリダクションって置き換えだっけ?
#λ変数を実引数でおきかえる
#ふむ
#モナドはβ簡約を表現している?それともそっからより一般化した表現ってことかな?
#一般化したもの
#いっぱんかというか拡張
#そのとき
#とみなせる
#returnや>>=がその簡約(というプロセス?)の中で担っている役割ってのがあるとすると
#モナド第1則が満たされない場合、その簡約のプロセスにおいてどういう意味を持つか?とか
#モナド則3は
#関数適用 f (g x) と (f . g) x が同じであることの保証
#なんだけど。1、2は
#1 は f (id x) と f x が同じであること
#2 は id x = x なる id があること
#そうしてみると1,2って重複してるように見えるのは私だけだろうか
#右単位元と左単位元のちがい
#関数適用とは?=>β簡約
#というおもむき
#に対して
#モナドが関数適用の一般化だという視点を獲得している人は
#関数適用とは?=>?????
#なんと説明するか?
#なんですが、どんな風に説明します?
#ああそれあんまり正確ないいかたじゃないかも、厳密にはツッコミどころ満載だと思うけど。
#1. は f . id ≡ f
#2.は id $ x ≡ x
#すみません。ちょっと呼ばれたので席をはずします
#3.は f $ g $ x ≡ f . g $ x
#その辺はアナロジー話にすぎません。コードや型を見てえた感覚的なもので、ちゃんとした形式的説明ができるかどうかは。。。
#from android
#6users chatting now?
#bye!
#?
#return = id , (>>=) = ($) = `id` とするとモナドの特殊ケースとして通常の関数適用になる
#合ってる…よねぇ
#あ、(=<<) = ($) = `id`か
#'hello haskellers' from Android
#スクロールはどなった?>yasuyuki
#i use Insertion.Bottom from prototype.js
#お、うまくいったのね。
#emulator scrolls fine.
#i will re-connect with dev phone one.
#bye
#i use dev phone one.
#it works so slow :(
#> sample の結果とsample' の結果が一致しないのはいやでしょ。
#
#もっと単純化すると
#sample = ps >>= return
sample' = fmap id ps
#の両者の結果が一致しないといやかということだよね。
#
#前者を計算していくと
#append (return 1) (append (return 2) Nil)
#後者を計算していくと
#Cons 1 (Cons 2 Nil)
#ここまでの計算でモナド則を使った書き換えは使っていないので
#異なった定義の両者は違った結果になってもいやじゃないような気がする。
#sample = do p <- ps
p2 <- ps
Cons p (Cons p2 Nil)
sample' = sequence [ps,ps]
#が一致しないことにはモナド則が原因のような気がする。
#上の sequence の例は間違いだった。
#sample = do p <- ps
p2 <- ps
Cons [p,p2] Nil
sample' = sequence [ps,ps]
#ga
#が一致しないことかな。
#いや、これも違った。orz
#evalStateT とか execStateT は名前が微妙だなあ
#意味的には valueOfRunStateT とか stateOfRunStateT なんだけど
#毎回忘れて ghci に :t evalStateT とかして思い出してる
#それか fmap fst $ runStateT ... とかしてるけどこれは StateT の実装に依存しているからあんまりよろしくない
#どうでもいいかもしれないけど結果が一致してるかどうか確認するのって (Eq 結果) じゃないとだめだよね
#generic な instance Eq (a -> b) が定義できないのはこの現実世界のバグ
#instance (Eq a, Eq b, Bounded a, Bounded b) => Eq (a -> b) ならどうにか作れるけどあんまりうれしくない
#三度目の正直
#f xs = Cons (sum xs) Nil
sample = do p <- ps
p2 <- ps
f [p,p2]
sample' = sequence [ps,ps] >>= f
#が一致しないこと。
#原因はモナド則1が成り立たないこと。