我测试了以下
的实现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序列)。
由于
答案 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