【发布时间】:2011-12-20 16:24:40
【问题描述】:
我们如何打印一个将 IO 字符串返回到标准输出的函数的输出?我无法使用 show 或 print。
【问题讨论】:
我们如何打印一个将 IO 字符串返回到标准输出的函数的输出?我无法使用 show 或 print。
【问题讨论】:
如果你想打印函数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
IO 是Monad 类的一个实例,所以你可以在这里使用它。
foo :: Int -> IO String
foo 12 :: IO String
putStrLn :: String -> IO ()
(foo 12) >>= putStrLn :: IO ()
【讨论】:
我们如何打印一个将 IO 字符串返回到标准输出的函数的输出?
好吧,让我们看看。这是一个返回 IO 字符串的函数:
dumbFunction :: a -> IO String
dumbFunction x = getLine
dumbFunction 是一个哑函数(但仍然是一个函数!)。它忽略其输入,然后返回getLine,其类型为IO String。
所以你告诉我,你如何打印getLine :: IO String?答案是,你没有!这就是我们所说的“IO 动作”。请注意,IO 操作不是一个函数,因为它确实不接受输入。 (但是,IO 操作可能会像 getLine 那样从读取标准输入等 IO 操作获取输入。但它不被视为“函数”,因为它不接受任何传统输入)
因此,您可能希望运行该动作,然后打印结果,而不是打印出动作本身。这可以按照 Daniel Fischer 的描述来完成(使用 <-,可以将其视为“运行”运算符)。
【讨论】: