我们如何打印将返回IO字符串的函数输出到stdout?我无法使用节目或印刷品。
答案 0 :(得分:18)
如果要打印函数foo :: Int -> IO String
的结果(例如),可以执行
main = do
str <- foo 12
putStrLn str
或者,没有做法,
main = foo 12 >>= putStrLn.
符号是第二种语法糖,它使用基本的(>>=)
组合子,其类型为
(>>=) :: 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 ()
答案 1 :(得分:6)
我们如何打印将IO String返回给stdout的函数的输出?
好吧,让我们看看。这是一个返回IO String的函数:
dumbFunction :: a -> IO String
dumbFunction x = getLine
dumbFunction
是一个愚蠢的功能(但仍然是一个功能!)。它会忽略其输入,然后返回getLine
,其类型为IO String
。
所以你告诉我,你如何打印getLine :: IO String
?答案是,你没有!这就是我们所说的“IO行动”。请注意,IO操作不是一个函数,因为它不接受输入。 (但是,IO动作可能会从{+ 1}}读取stdin等IO操作中获取输入。但它不被视为“函数”,因为它不接受任何传统输入)
因此,您可能希望运行操作,而不是打印出操作本身,然后打印结果。这可以像Daniel Fischer所描述的那样(使用getLine
来完成,可以将其视为“运行”运算符。)