簡體   English   中英

在Haskell中將一個IO字符串寫入stdout

[英]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

IOMonad類的一個實例,因此您可以在此處使用它。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM