putStr在IO()函数

时间:2018-04-03 06:15:40

标签: haskell io monads

如何在另一个IO()函数内调用IO()函数?我想打印到标准输出然后调用函数来做同样的事情。

例如,

p :: String -> IO ()
p [x] = putStr x
p xs = q xs

q :: String -> IO ()
q (x:xs) = putStr x ++ p xs

1 个答案:

答案 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

但请注意,您尚未与pq上的空列表匹配。

大约在这个时候你应该注意到用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