我一直试图弄清楚如何在IO monad中进行递归.我熟悉使用纯函数进行递归,但是无法将这些知识传递给IO monad.
使用纯函数递归
我很喜欢用纯函数进行递归,例如foo下面的函数.
foo (x:y:ys) = foo' x y ++ foo ys
Run Code Online (Sandbox Code Playgroud)
一个带有IO [String]输出
的函数我做了一个像goo下面这样的函数,它可以满足我的需求并具有IO输出.
goo :: String -> String -> IO [String]
goo xs ys = goo' xs ys
Run Code Online (Sandbox Code Playgroud)
试图在IO monad中获取递归
当我尝试在IO monad中进行递归时(例如,"主"函数)我不能.我抬头一看liftM,replicateM和撤消最IO <-操作或功能.我想要一个IO monad hoo或者hoo'(为随后的乱码道歉).
hoo :: [String] -> IO [String]
hoo (xs:ys:yss) = do
let rs = goo xs ys ++ hoo yss
return rs
Run Code Online (Sandbox Code Playgroud)
要么
hoo' :: [String] -> IO [String]
hoo' …Run Code Online (Sandbox Code Playgroud)