我想我明白列表monad但後來我發現我不是。這是故事。是(>>)應該放棄所有左側輸出嗎?
定列表m
和功能k
> let m = [1..10]
> :t m
m :: [Integer]
> let k = replicate 2
> :t k
k :: a -> [a]
與綁定>>=
播放給我的期望
> :t (>>=)
(>>=) :: Monad m => m a -> (a -> m b) -> m b
> :t m >>= k
m >>= k :: [Integer]
> m >>= k
[1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10]
但>>
預期(從IO單子,一切都在經歷上留下方將被丟棄)
m >> m
[1,2,3,4,5,6,7,8,9,10]
得到
> :t (>>)
(>>) :: Monad m => m a -> m b -> m b
:t m >> m
m >> m :: [Integer]
> m >> m
[1,2,3,4,5,6,7,8,9,10,1,2,3,4,5 ... 9,10] -- truncated, real output is 100 elements
請解釋爲什麼>>
沒有表現得像我預期(當然我必須有誤解),什麼是解釋>>
正確的方法是什麼?
哇!多麼清楚(而且非常快)的答案。謝謝 – wizzup 2013-02-19 09:16:13