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

时间:2011-12-20 16:24:41

标签: haskell io stdout

我们如何打印将返回IO字符串的函数输出到stdout?我无法使用节目或印刷品。

2 个答案:

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

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

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来完成,可以将其视为“运行”运算符。)