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

JDL*_*aha 0 haskell

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

dav*_*420 10

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

无论如何,你是一个do街区,并写了这样的东西,是吗?

main = do
    ...
    writeFile "some-file.txt" (show generateRandomNumberSomehow)
    ...
Run Code Online (Sandbox Code Playgroud)

你应该做这样的事情:

main = do
    ...
    randomNumber <- generateRandomNumberSomehow
    writeFile "some-file.txt" (show randomNumber)
    ...
Run Code Online (Sandbox Code Playgroud)

<-操作者结合的结果IO Int到右边值Int左侧值得变量.(是的,您也可以使用它将值的结果绑定IO String到一个String值 - 变量等)

此语法仅在do块内有效.重要的是要注意该do块本身会产生一个IO值 - 你无法清除IO-ness.


lef*_*out 5

dave4420 的答案就是你想要的。IO它使用了以下事实Monad: ; 这就是为什么你可以使用该do符号。

然而,我认为值得一提的是,“将函数应用于不是‘开放’的值,而是在某个包装器内部”的概念实际上比IOmonad 更通用。这就是我们上课的目的Functor

对于任何函子f(例如,这可以是Maybeor[]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
Run Code Online (Sandbox Code Playgroud)