我正在学习在Haskell中使用输入和输出。我正在尝试生成一个随机数并将其输出到另一个文件。问题是随机数似乎返回“IO int”,我无法使用“show”将其转换为String。有人能给我一个指针吗?
答案 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的答案就是你想要的。它使用IO
是Monad
的事实;这就是为什么你可以使用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}}