我有一个简单的列表,我想在每个元素之间迭代“yield”并将该元素打印到输出。我正在尝试使用 ContT monad 来执行此操作,但遇到了问题。这是我到目前为止所拥有的:
data K a = Nil | K (a,() -> K a)
listIterator :: (Monad m) => [r] -> m (K r)
listIterator [] = return Nil
listIterator (x:xs) = return (ContT (\k -> K (x,k))) >> listIterator xs
runIterator :: IO ()
runIterator = do
a <- listIterator ([1,2,3] :: [Int])
let loop Nil = liftIO $ print "nil"
loop (K (curr,newI)) =
do
liftIO $ print curr
loop (newI ())
loop a
预期的输出是:
1
2
3
nil
我得到的是:
nil
任何帮助表示赞赏!