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