我正在学习在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.
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)