Haskell不同的sequence_实现

时间:2015-12-07 17:22:45

标签: haskell monads

我测试了以下

的实现
sequence_' :: Monad m => [m a] -> m () 

sequence_'b [] = return ()
sequence_'b (m : ms) = (foldl (>>) m ms) >> return ()

sequence_'d [] = return ()
sequence_'d (m : ms) = m >> sequence_'d ms

sequence_'e [] = return ()
sequence_'e (m : ms) = m >>= \ _ -> sequence_'e ms

sequence_'g ms = foldr (>>) (return ()) ms

为了测试这些,我使用了以下内容:

sequence_'e [putChar 'a', putChar 'b', putChar 'c']

sequence_'e [getChar, getChar, getChar]

上述测试有效。第一个将值abc放在HUGS屏幕上,光标返回到下一行。

第二个接受在HUGS屏幕上键入的三个字符,光标返回到下一行。

请建议我可以做更多的测试来测试sequence_的这些实现(我猜这是一个Monad序列)。

由于

1 个答案:

答案 0 :(得分:2)

检查Haskell

中的无限列表会发生什么通常很好
sequence_ (repeat (putChar 'a'))

以及像Writer

这样的懒惰单子
import Control.Monad.Writer
execWriter (sequence_ (repeat (tell "a")))

如果我的直觉是正确的,那么你应该看到你的实现与这些案例之间至少存在一个区别。

哦,只是为了纠正你的词汇量。 sequence只是一个函数(有些人称之为" monadic函数")。以下是关于实际monad的位置的一些图表:

putChar :: Char -> IO   ()
                   ^^
                  monad

tell :: w -> Writer w   ()
             ^^^^^^^^
              monad

sequence_ :: (Monad m) => [m a] -> m ()
                    ^      ^       ^
                    +------+-------+
                          monad