如何将返回 IO String 的函数的输出打印到 stdout?我无法使用 show 或 print。
如果你想要输出函数foo :: Int -> IO String
的结果(例如),你可以这样做:
main = do
str <- foo 12
putStrLn str
或者,不使用do-notation的方式:
main = foo 12 >>= putStrLn.
do-notation是第二种方式的语法糖,第二种方式使用的是基本的(>>=)
组合子,其类型为
(>>=) :: Monad m => m a -> (a -> m b) -> m b
IO
是 Monad
类的一个实例,所以你可以在这里使用它。
foo :: Int -> IO String
foo 12 :: IO String
putStrLn :: String -> IO ()
(foo 12) >>= putStrLn :: IO ()
dumbFunction :: a -> IO String
dumbFunction x = getLine
dumbFunction
是一个愚蠢的函数(但它仍然是一个函数!)。它忽略了输入,然后返回类型为IO String
的getLine
。
那么告诉我,你如何打印getLine :: IO String
?答案是,你不需要打印!这就是我们所说的“IO操作”。请注意,IO操作不是函数,因为它不接受输入。(但是,IO操作可能会从IO操作(例如读取stdin)中获取输入,如getLine
。但它不被认为是“函数”,因为它不接受任何传统输入)
因此,您可能想要运行该操作,然后打印结果。这可以像Daniel Fischer所描述的那样完成(使用<-
,可以将其视为“运行”运算符)。