在Haskell中将IO字符串写入标准输出

14

如何将返回 IO String 的函数的输出打印到 stdout?我无法使用 show 或 print。

2个回答

24

如果你想要输出函数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

IOMonad 类的一个实例,所以你可以在这里使用它。

foo :: Int -> IO String
foo 12 :: IO String

putStrLn :: String -> IO ()

(foo 12) >>= putStrLn :: IO ()

通常情况下,你可以这样说:´printio = do oi <- io \n print io´。 - schuelermine

6
我们如何将返回 IO String 的函数的输出打印到 stdout 上呢?
好的,让我们看看。这里有一个返回 IO String 的函数:
dumbFunction :: a -> IO String
dumbFunction x = getLine

dumbFunction是一个愚蠢的函数(但它仍然是一个函数!)。它忽略了输入,然后返回类型为IO StringgetLine

那么告诉我,你如何打印getLine :: IO String?答案是,你不需要打印!这就是我们所说的“IO操作”。请注意,IO操作不是函数,因为它不接受输入。(但是,IO操作可能会从IO操作(例如读取stdin)中获取输入,如getLine。但它不被认为是“函数”,因为它不接受任何传统输入)

因此,您可能想要运行该操作,然后打印结果。这可以像Daniel Fischer所描述的那样完成(使用<-,可以将其视为“运行”运算符)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接