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

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)

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

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

putStrLn :: String -> IO ()

(foo 12) >>= putStrLn :: IO ()
Run Code Online (Sandbox Code Playgroud)


Dan*_*ton 6

我们如何打印一个返回一个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所描述的那样完成(<-可以将其视为"运行"运算符).