Haskell序列的不同实现_

Haskell序列的不同实现_,haskell,monads,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_' :: 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']

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

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

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


谢谢

检查Haskell中无限列表的情况通常是好的

sequence_ (repeat (putChar 'a'))
还有懒惰的monad,比如
Writer

import Control.Monad.Writer
execWriter (sequence_ (repeat (tell "a")))
如果我的直觉是正确的,那么您应该看到这些案例的实现之间至少有一个区别

哦,只是为了纠正你的词汇量<代码>序列只是一个函数(有些人称之为“一元函数”)。下面是一些关于实际monad所在位置的图表:

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

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

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

我在拥抱。我想这是Haskell 98。当我尝试通过脚本导入Control.Monad.Writer时,出现了以下错误。错误文件:{Hugs}\packages\mtl\Control\Monad\Reader.hs:47-Haskell 98不支持依赖参数,请尝试Control.Monad.Trans.Writer,然后我想。Trans来自transformers软件包,它没有使用那么多令人毛骨悚然的功能
putChar :: Char -> IO   ()
                   ^^
                  monad

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

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