atl*_*tis 11 io haskell stdout
我们如何打印一个返回一个IO字符串的函数的输出到stdout?我无法使用节目或印刷品.
Dan*_*her 18
如果要打印函数的结果foo :: Int -> IO String
(例如),则可以执行此操作
main = do
str <- foo 12
putStrLn str
Run Code Online (Sandbox Code Playgroud)
或者,没有记号,
main = foo 12 >>= putStrLn.
Run Code Online (Sandbox Code Playgroud)
符号是第二种语法糖,它使用(>>=)
具有类型的基本组合子
(>>=) :: Monad m => m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)
IO
是Monad
类的一个实例,所以你可以在这里使用它.
foo :: Int -> IO String
foo 12 :: IO String
putStrLn :: String -> IO ()
(foo 12) >>= putStrLn :: IO ()
Run Code Online (Sandbox Code Playgroud)
我们如何打印一个返回一个IO字符串的函数的输出到stdout?
好的,我们等着瞧.这是一个返回IO字符串的函数:
dumbFunction :: a -> IO String
dumbFunction x = getLine
Run Code Online (Sandbox Code Playgroud)
dumbFunction
是一个愚蠢的功能(但仍然是一个功能!).它忽略了它的输入,然后返回getLine
,它有类型IO String
.
所以你告诉我,你怎么打印getLine :: IO String
?答案是,你没有!这就是我们所说的"IO行动".需要注意的是一个IO动作是不是一个功能,因为它并没有采取输入.(但是,IO操作可能会从IO操作中获取输入,例如读取stdin,getLine
但是它不被视为"函数",因为它不接受任何传统输入)
因此,您可能希望运行操作,然后打印结果,而不是打印出操作本身.这可以像Daniel Fischer所描述的那样完成(<-
可以将其视为"运行"运算符).