簡體   English   中英

如何在Haskell中將IO int轉換為String?

[英]How to convert IO int to String in Haskell?

我正在學習在Haskell中使用輸入和輸出。 我正在嘗試生成一個隨機數並將其輸出到另一個文件。 問題在於隨機數似乎正在返回“ IO int”,我無法使用“ show”將其隱式轉換為String。 有人可以給我指點嗎?

如果您向我們展示您編寫的不起作用的代碼,這將很有幫助。

無論如何,您處於do塊中並且已經編寫了類似的內容,是嗎?

main = do
    ...
    writeFile "some-file.txt" (show generateRandomNumberSomehow)
    ...

您應該改為執行以下操作:

main = do
    ...
    randomNumber <- generateRandomNumberSomehow
    writeFile "some-file.txt" (show randomNumber)
    ...

<-運算符將右側IO Int值的結果綁定到左側的Int值變量。 (是的,您還可以使用此方法將IO String值的結果綁定到String值的變量等)。

此語法僅在do塊內有效。 重要的是要注意, do塊本身會產生IO值---您不能洗除IO-ness。

dave4420的答案是您在這里想要的。 它利用IOMonad的事實; 這就是為什么您可以使用do表示法。

但是,我認為值得一提的是,“將函數應用於不是'open'的值,而是在某些包裝器中”的概念實際上比IO更普遍,比monad更普遍。 這就是我們的Functor類的目的。

對於任何函子f (例如,可能是Maybe[]IO ),當您有一些價值時
wrapped :: ft (例如, wrapped :: Maybe Int fmap wrapped :: Maybe Int ),您可以使用fmap來應用函數
t -> t'到它(例如show :: Int -> String )並得到一個
wrappedApplied :: f t' (就像wrappedApplied :: Maybe String )。

在您的示例中,

genRandomNumAsString :: IO String
genRandomNumAsString = fmap show genRandomNumPlain

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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