Haskell 将随机数列表写入文件。没有(显示(IO a0))的实例

Haskell 将随机数列表写入文件。没有(显示(IO a0))的实例,haskell,random,Haskell,Random,我正试图写入一个文件中的随机整数列表。这里的writeFile似乎有问题。当我使用函数randomFile时,它会说没有(Show(IO a0))的实例。我看到writeFile只在屏幕上打印IO(),所以当我调用函数randomfile1 2 3时,它说没有Show实例(IO a0),但实际上我只想执行函数,不需要打印任何东西,但如何避免这个问题呢。我可能在这里犯了很多错误。任何帮助 import Control.Monad import Control.Applicative import

我正试图写入一个文件中的随机整数列表。这里的
writeFile
似乎有问题。当我使用函数
randomFile
时,它会说
没有(Show(IO a0))的实例
。我看到
writeFile
只在屏幕上打印
IO()
,所以当我调用函数
randomfile1 2 3
时,它说
没有Show实例(IO a0)
,但实际上我只想执行函数,不需要打印任何东西,但如何避免这个问题呢。我可能在这里犯了很多错误。任何帮助

import Control.Monad
import Control.Applicative
import System.Random

randNo mind maxd = randomRIO (mind,maxd)
randomFile mind maxd noe = do
  let l=(replicate (fromInteger(noe ^ noe)) ( mind `randNo` maxd))
  writeFile "RFile.txt" (show l)

我想你误解了IO是什么。如果你还没有做过,我强烈建议你通过考试

IO
不一定与
print
有关。在Haskell中,内存中由您自己的代码生成的每个条目都被认为是“纯”的,而任何涉及计算机其余部分的条目都存在于IO中(随着时间的推移,您将了解到一些例外情况)

我们使用一种叫做Monad的东西来建模IO。你做Haskell的时间越长,你就会了解更多。为了理解这一点,让我们看一个使用和不使用IO的代码示例:

noIOused :: Int -> Int
noIOused x = x + 5

usesIO :: Int -> IO Int
usesIO x = print x >> return (x + 5)

usesIO2 :: Int -> IO Int
usesIO2 x = do
    print x
    return (x + 5)
第一个功能是“纯”。第二个和第三个功能具有IO“效果”,以打印到屏幕的形式出现
usesIO
usesIO2
只是做同一件事的两种不同方式(代码相同,但语法不同)。我将从这里使用第二种格式,称为
do
notation

以下是其他一些可以产生IO效果的方法:

add5WithFile :: Int -> IO Int
add5WithFile x = do
    writeFile "someFile.txt" (show x)
    return (x + 5)
请注意,在该函数中,我们没有打印任何内容,而是编写了一个文件。但是,编写文件会产生副作用,并且会与系统的其他部分交互。因此,我们返回的任何值都必须包装在IO中

addRandom :: Int -> IO Int
addRandom x = do
    y <- randomRIO (1,10)
    return (x + y)

我想你误解了IO是什么。如果你还没有做过,我强烈建议你通过考试

IO
不一定与
print
有关。在Haskell中,内存中由您自己的代码生成的每个条目都被认为是“纯”的,而任何涉及计算机其余部分的条目都存在于IO中(随着时间的推移,您将了解到一些例外情况)

我们使用一种叫做Monad的东西来建模IO。你做Haskell的时间越长,你就会了解更多。为了理解这一点,让我们看一个使用和不使用IO的代码示例:

noIOused :: Int -> Int
noIOused x = x + 5

usesIO :: Int -> IO Int
usesIO x = print x >> return (x + 5)

usesIO2 :: Int -> IO Int
usesIO2 x = do
    print x
    return (x + 5)
第一个功能是“纯”。第二个和第三个功能具有IO“效果”,以打印到屏幕的形式出现
usesIO
usesIO2
只是做同一件事的两种不同方式(代码相同,但语法不同)。我将从这里使用第二种格式,称为
do
notation

以下是其他一些可以产生IO效果的方法:

add5WithFile :: Int -> IO Int
add5WithFile x = do
    writeFile "someFile.txt" (show x)
    return (x + 5)
请注意,在该函数中,我们没有打印任何内容,而是编写了一个文件。但是,编写文件会产生副作用,并且会与系统的其他部分交互。因此,我们返回的任何值都必须包装在IO中

addRandom :: Int -> IO Int
addRandom x = do
    y <- randomRIO (1,10)
    return (x + y)

那么,我是否正确理解了
randomFile
应该在
[mind,maxd]
RFile.txt
的范围内编写
noe
随机数?
let l…
行有点混乱。好吧,经过多次编辑,我有点明白了。所以在那次评论之后,我意识到没有必要使用foldl。randomFile应该在文件中写入
noe^2
(表达式的数量),每个表达式将包含多个整数(尚未完成)。问题标题是否适合该问题。因此,我是否正确理解
randomFile
应该在
[注意,maxd]
RFile.txt
?让l…
行有点混乱。经过多次编辑后,我有点明白了。因此,在注释之后,我意识到不需要foldl。randomFile应该将
noe^2
(没有表达式)写入文件,每个表达式将包含多个无整数(尚未完成).我知道一些我刚学过的概念,但缺乏任何编码实践来实际实现这些概念。这是一个出色的书面回答。非常感谢。我读得越多,就越发现每个人对单子的了解都不同。很高兴你找到了一个适合你的教程!如果你想测试你的知识,请当然,你已经完成了20个中间练习。我知道一些我刚学过的概念,但缺乏任何实际实现的编码实践。这是一个写得很好的答案。非常感谢你。我读得越多,我就越发现每个人对单子的学习都不一样。很高兴你找到了一个有效的教程给你!如果你想测试你的知识,一定要通过20个中间练习。
randNo :: Int -> Int -> IO Int
randNo mind maxd = randomRIO (mind,maxd)
randomFile mind maxd noe = do
  l <- replicate (fromInteger(noe ^ noe)) ( mind `randNo` maxd)
  writeFile "RFile.txt" (show l)
sequence :: Monad m => [m a] -> m [a]
randomFile mind maxd noe = do
  l <- sequence (replicate (fromInteger(noe ^ noe)) ( mind `randNo` maxd))
  writeFile "RFile.txt" (show l)
replicateM :: Monad m => Int -> m a -> m [a]
randomFile mind maxd noe = do
  l <- replicateM (fromInteger(noe ^ noe)) ( mind `randNo` maxd)
  writeFile "RFile.txt" (show l)
randomFile mind maxd noe = randomRIO >>= writeFile "RFile.txt" . replicateM (fromInteger(noe ^ noe))