[英]Writing an IO String to stdout in Haskell
我们如何打印一个返回一个IO字符串的函数的输出到stdout? 我无法使用节目或印刷品。
如果要打印函数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 ()
我们如何打印一个返回一个IO字符串的函数的输出到stdout?
好吧,走着瞧。 这是一个返回IO字符串的函数:
dumbFunction :: a -> IO String
dumbFunction x = getLine
dumbFunction
是一个哑函数(但仍然是一个函数!)。 它忽略其输入,然后返回getLine
,其类型为IO String
。
所以你告诉我,你如何打印getLine :: IO String
? 答案是,你没有! 这就是我们所说的“IO行动”。 需要注意的是一个IO动作是不是一个功能,因为它并不需要输入。 (但是,IO操作可能会获取来自IO操作的输入,例如读取stdin,就像getLine
一样。但它不被视为“函数”,因为它不接受任何传统输入)
因此,您可能希望运行操作,然后打印结果,而不是打印出操作本身。 这可以像Daniel Fischer所描述的那样完成(带<-
,可以将其视为“运行”运算符)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.