2012-10-15 88 views
0

我正在學習在Haskell中使用輸入和輸出。我試圖生成一個隨機數並將其輸出到另一個文件。問題是隨機數似乎返回「IO int」,我無法使用「show」將它轉換爲String。有人能給我一個指針嗎?如何將IO int轉換爲Haskell中的字符串?

+0

這並沒有幫助? http://stackoverflow.com/a/2784280/1268844 – Anshu

+2

你試過什麼代碼? – kennytm

回答

9

如果您向我們展示您編寫的代碼無法正常工作,那麼這很有幫助。

無論如何,你在do區塊,並寫了類似的東西,是嗎?

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

而應該做這樣的事情:

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

<-運營商結合到左邊的Int值得變量的權值IO Int的結果。 (是的,您也可以使用它將IO String值的結果綁定到String值的變量等。)

此語法只在do塊內有效。需要注意的是,do塊本身會產生一個IO值 - 您無法清除IO內存。

+0

非常感謝您的幫助!我花了一整天的時間試圖弄清楚這個> _ <!謝謝!! –

3

dave4420的答案就是你想要的。它使用的事實是IOMonad;這就是爲什麼你可以使用do表示法。然而,我認爲值得一提的是,「將函數應用於不是'打開'的值,而是在一些包裝中'實際上比IO更普遍,比單子更普遍。這是我們的Functor類。

對於任何仿函數f(這可能,例如,是Maybe[]IO),當你有一定的價值
wrapped :: f t(例如wrapped :: Maybe Int),你可以使用fmap應用功能
t -> t'它(如show :: Int -> String)並獲得
wrappedApplied :: f t'(如wrappedApplied :: Maybe String)。

在您的例子,這將是

genRandomNumAsString :: IO String 
genRandomNumAsString = fmap show genRandomNumPlain 
+0

正是我想補充的,是的。 +1。在'IO'中''fmap'非常方便。 – AndrewC