如何在另一个IO()函数内调用IO()函数?我想打印到标准输出然后调用函数来做同样的事情。
例如,
p :: String -> IO ()
p [x] = putStr x
p xs = q xs
q :: String -> IO ()
q (x:xs) = putStr x ++ p xs
答案 0 :(得分:3)
您的第一个问题是键入
p [x] = putStr x
{- putStr :: String -> IO ()
x :: Char, not a String
-}
和
q (x:xs) = putStr x ++ p xs
{- (++) :: [a] -> [a] -> [a]
putStr x :: IO (), not a list of anything.
-}
让我们首先看q
,因为它来自p
。您将其分解为字符,因此您应该使用putChar
而不是putStr
另外,我们正在查看排序操作,因此我们应该使用(>>)
或(>>=)
,具体取决于您是否需要结果。在这种情况下,结果是单位类型(()
)的值,这是一个无用的结果,可以安全忽略。
q :: String -> IO ()
q (x:xs) = putChar x >> p xs
{- or using `do` notation:
q (x:xs) = do
putChar x
p xs
-}
同样可以更改 p
以使用putChar
而不是putStr
p :: String -> IO ()
p [x] = putChar x
p xs = q xs
但请注意,您尚未与p
或q
上的空列表匹配。
大约在这个时候你应该注意到用putChar
替换putStr
只是为了让你可以将字符串分解为Chars,这是一种落后的想法。 p = putStr
你已经完成了。但是,如果你致力于这种落后的思考:
import Control.Monad (foldM_, mapM_)
p = foldM_ (\_ x -> putChar x) ()
-- or
p = foldM_ ((putChar .) . flip const) ()
-- or
p = mapM_ putChar