繁体   English   中英

在Haskell中将一个IO字符串写入stdout

[英]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

IOMonad类的一个实例,因此您可以在此处使用它。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM