如何在IOaskell中将IO int转换为String?

时间:2012-10-15 09:31:21

标签: haskell

我正在学习在Haskell中使用输入和输出。我正在尝试生成一个随机数并将其输出到另一个文件。问题是随机数似乎返回“IO int”,我无法使用“show”将其转换为String。有人能给我一个指针吗?

2 个答案:

答案 0 :(得分:10)

如果您向我们展示您编写的无效代码,将会很有帮助。

无论如何,你在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。

答案 1 :(得分:4)

dave4420的答案就是你想要的。它使用IOMonad的事实;这就是为什么你可以使用do表示法。

但是,我认为值得一提的是,“将函数应用于不是'开放'但在某个包装器中的值”的概念实际上比IO更通用,并且比monad更通用。这就是我们拥有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 )。

在您的示例中,它将是

{{1}}