[英]Writing an IO String to stdout in Haskell
我們如何打印一個返回一個IO字符串的函數的輸出到stdout? 我無法使用節目或印刷品。
如果要打印函數foo :: Int -> IO String
(例如)的結果,可以這樣做
main = do
str <- foo 12
putStrLn str
或者,沒有記號,
main = foo 12 >>= putStrLn.
符號是第二種語法糖,它使用基本(>>=)
組合子,它具有類型
(>>=) :: 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字符串的函數的輸出到stdout?
好吧,走着瞧。 這是一個返回IO字符串的函數:
dumbFunction :: a -> IO String
dumbFunction x = getLine
dumbFunction
是一個啞函數(但仍然是一個函數!)。 它忽略其輸入,然后返回getLine
,其類型為IO String
。
所以你告訴我,你如何打印getLine :: IO String
? 答案是,你沒有! 這就是我們所說的“IO行動”。 需要注意的是一個IO動作是不是一個功能,因為它並不需要輸入。 (但是,IO操作可能會獲取來自IO操作的輸入,例如讀取stdin,就像getLine
一樣。但它不被視為“函數”,因為它不接受任何傳統輸入)
因此,您可能希望運行操作,然后打印結果,而不是打印出操作本身。 這可以像Daniel Fischer所描述的那樣完成(帶<-
,可以將其視為“運行”運算符)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.