我正在学习在 Haskell 中使用输入和输出。我正在尝试生成一个随机数并将其输出到另一个文件。问题是随机数似乎返回了一个IO Int
我无法转换为String
using的东西show
。
有人可以在这里给我指点吗?
如果您向我们展示您编写的不起作用的代码,这将很有帮助。
不管怎样,你在一个do
街区里写了这样的东西,是吗?
main = do
...
writeFile "some-file.txt" (show generateRandomNumberSomehow)
...
您应该改为执行以下操作:
main = do
...
randomNumber <- generateRandomNumberSomehow
writeFile "some-file.txt" (show randomNumber)
...
运算符将右侧值的结果绑定到左侧的-valued<-
变量。(是的,您也可以使用它来将值的结果绑定到-valued 变量等)IO Int
Int
IO String
String
此语法仅在do
块内有效。重要的是要注意,do
块本身会产生一个 IO 值——你不能洗掉 IO-ness。
dave4420's answer is what you want here. It uses the fact that IO
is a Monad
; that's why you can use the do
notation.
However, I think it's worth mentioning that the concept of "applying a function to a value that's not 'open', but inside some wrapper" is actually more general than IO
and more general than monads. It's what we have the Functor
class for.
For any functor f
(this could, for instance, be Maybe
or []
or IO
), when you have some value
wrapped :: f t
(for instance wrapped :: Maybe Int
), you can use fmap
to apply a function
t -> t'
to it (like show :: Int -> String
) and get a
wrappedApplied :: f t'
(like wrappedApplied :: Maybe String
).
In your example, it would be
genRandomNumAsString :: IO String
genRandomNumAsString = fmap show genRandomNumPlain