Я просто смотрел видео на Haskell, так что я пытался играть немного с ним, но я не могу понять это (Короче говоря, я хочу, чтобы напечатать одну случайную величину):Как использовать значение, произведенное в другом блоке do?
import System.Random
import System.IO
randomNum = do
gen <- newStdGen
let ns = randoms gen :: [Int]
let val = take 10 ns
print $ head val
writeToFile = do
theFile <- openFile "test.txt" WriteMode
let val = randomNum;
hPutStrLn theFile ("Random number " ++ randomNum)
hClose theFile
readFromFile = do
theFile2 <- openFile "test.txt" ReadMode
contents <- hGetContents theFile2
putStr contents
hClose theFile2
randomNum кажется работать нормально, но когда я пытаюсь поместить это на writeToFile, он вызывает ошибку. Что я могу сделать?
Заранее благодарен!
EDIT: Я получаю ошибку в начале это:
Prelude> :r
[1 of 1] Compiling Main (haskell.hs, interpreted)
haskell.hs:207:48:
No instance for (Show (IO())) arising from a use of `show'
In the second argument of `(++)', namely `show randomNum'
In the second argument of `hPutStrLn', namely
`("Random number " ++ show randomNum)'
In a stmt of a 'do' block:
hPutStrLn theFile ("Random number " ++ show randomNum)
Failed, modules loaded: none.
Какая ошибка вы получаете? –
Прелюдия>: г [1 из 1] Сборка Основное (haskell.hs, интерпретируемый) haskell.hs: 207: 48: не могли соответствовать Ожидаемый тип '[Char]» с фактическим типом 'IO() Во втором аргументе '(++) ', а именно' randomNum' Во втором аргументе 'hPutStrLn ', а именно ' («Случайное число» ++ randomNum)' Ошибка, модули загружены: нет. – ffuentes
Если вы хотите только одно значение, вы можете просто написать 'val <- randomIO :: IO Int', или' val <- randomRIO (1 :: Int, 10) ', чтобы получить его в определенном диапазоне (здесь, из От 1 до 10 включительно). –