如何在Haskell中将IO int转换为字符串?

如何在Haskell中将IO int转换为字符串?,haskell,Haskell,我正在学习使用Haskell中的输入和输出。我试图生成一个随机数并将其输出到另一个文件。问题是随机数似乎返回IO int,我无法使用show将其转换为字符串。有人能在这里给我一个指针吗?如果你给我们看一下你写的不起作用的代码,那会很有帮助的 不管怎么说,你在一个do区,写过这样的东西,是吗 main = do ... writeFile "some-file.txt" (show generateRandomNumberSomehow) ... 相反,您应该这样做: m

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

如果你给我们看一下你写的不起作用的代码,那会很有帮助的

不管怎么说,你在一个do区,写过这样的东西,是吗

main = do
    ...
    writeFile "some-file.txt" (show generateRandomNumberSomehow)
    ...
相反,您应该这样做:

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

dave4420的答案正是您想要的。它使用IO是单子的事实;这就是为什么你可以使用do符号

然而,我认为值得一提的是,将函数应用于一个不是“开放”的值,但在某些包装器中,这个概念实际上比IO和Monad更通用。这就是我们有函子类的目的

例如,对于任何函子f,当你有一些值时,它可能是或[]或IO wrapped::f t例如wrapped::Maybe Int,您可以使用fmap应用函数 t->t'像show::Int->String一样打开它,并获得一个 wrappedApplied::f t'就像wrappedApplied::可能是字符串

在你的例子中,它是

genRandomNumAsString :: IO String
genRandomNumAsString = fmap show genRandomNumPlain

这没有帮助吗?非常感谢你的帮助!!我花了一整天的时间想弄明白这一点,这正是我想补充的,是的+1.fmap在IO中非常方便。