Haskell 如何使用在另一个do块中生成的值?

Haskell 如何使用在另一个do块中生成的值?,haskell,Haskell,我刚刚在Haskell上看了一段视频,所以我试着用它来播放一点,但我无法理解这一点(简而言之,我想打印一个随机值): 看起来你需要的是 randomNum = do gen <- newStdGen return (head (randoms gen :: [Int])) writeToFile = do theFile <- openFile "test.txt" WriteMode val <- randomNum hPutStrLn

我刚刚在Haskell上看了一段视频,所以我试着用它来播放一点,但我无法理解这一点(简而言之,我想打印一个随机值):


看起来你需要的是

randomNum = do
   gen <- newStdGen
   return (head (randoms gen :: [Int]))

writeToFile = do
    theFile <- openFile "test.txt" WriteMode
    val <- randomNum
    hPutStrLn theFile ("Random number " ++ show val)
    hClose theFile
randomNum=do

gen看起来你需要的是

randomNum = do
   gen <- newStdGen
   return (head (randoms gen :: [Int]))

writeToFile = do
    theFile <- openFile "test.txt" WriteMode
    val <- randomNum
    hPutStrLn theFile ("Random number " ++ show val)
    hClose theFile
randomNum=do

gen您可以尝试以下方法:

import System.Random
import System.IO

writeToFile = do
    gen <- newStdGen
    let ns = randoms gen :: [Int]
    let val = head ns;
    theFile <- openFile "test.txt" WriteMode
    hPutStrLn theFile ("Random number " ++ show val)
    hClose theFile

readFromFile = do 
    theFile2 <- openFile  "test.txt" ReadMode
    contents <- hGetContents theFile2
    putStr contents
    hClose theFile2
导入系统。随机
导入系统.IO
writeToFile=do

gen您可以尝试以下方法:

import System.Random
import System.IO

writeToFile = do
    gen <- newStdGen
    let ns = randoms gen :: [Int]
    let val = head ns;
    theFile <- openFile "test.txt" WriteMode
    hPutStrLn theFile ("Random number " ++ show val)
    hClose theFile

readFromFile = do 
    theFile2 <- openFile  "test.txt" ReadMode
    contents <- hGetContents theFile2
    putStr contents
    hClose theFile2
导入系统。随机
导入系统.IO
writeToFile=do

gen您得到了什么错误?Prelude>:r[1/1]编译Main(haskell.hs,已解释)haskell.hs:207:48:无法将
[Char]'的第二个参数中的预期类型与实际类型
IO(),即
hPutStrLn'的第二个参数中的
randomNum',即
(“Random number”++randomNum)失败,加载的模块:无。如果您只需要一个值,您可以只写
val,会出现什么错误?Prelude>:r[1/1]编译Main(haskell.hs,已解释)haskell.hs:207:48:无法将预期的类型
[Char]'与实际类型
IO()在
(++)的第二个参数中,即
randomNum',在
hPutStrLn的第二个参数中,即
(“Random number”+++randomNum)”失败,加载的模块:无。如果您只需要一个值,您只需编写
val即可。我尝试了它,得到了“无法将IO()类型与IO匹配”()->IntIt给了我一个错误,但是它太长了,无法发表评论。我很确定您想要
show val
而不是
show randomNum
。函数通常不会很好地显示…使用此解决方案时,错误是Prelude>:r[1/1]编译Main(haskell.hs,已解释)haskell.hs:207:44:没有因在
(++)的第二个参数中使用
show'而产生的(show(IO Int))实例,即
hPutStrLn'的第二个参数中的
show randomNum',即“do”块的stmt中的“(“Random number”++show randomNum”):hPutStrLn文件(“Random number”++show randomNum)失败,加载的模块:无。序曲>那是由@recursion.ninja的编辑修复的;它是
show val
,而不是
show randomNum
。我尝试了它,得到了“无法将IO()类型与IO()匹配->IntIt给我一个错误,但它太长,无法进行注释。我很确定您希望
show val
而不是
show randomNum
。函数通常显示不太好…使用此解决方案时,错误是前奏>:r[1/1]编译Main(haskell.hs,已解释)haskell.hs:207:44:由于在
(++)的第二个参数中使用了
Show',即在
hPutStrLn的第二个参数中使用
Show randomNum',即`(“随机数”++Show randomNum),因此没有(Show(IO Int))的实例'在'do'块的stmt中:hPutStrLn文件(“随机数”++显示随机数)失败,加载的模块:无。Prelude>该WW由@recursion.ninja的编辑修复;它是
show val
,而不是
show randomNum