[英]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的答案是您在這里想要的。 它利用IO
是Monad
的事實; 這就是為什么您可以使用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.