Я пытаюсь расширить код в этом сообщении (принятый ответ), чтобы я мог вызовите randomGen2, чтобы получить случайное число, на основе функции randomGen, которая принимает начальное число в качестве аргумента. Но каждый раз, когда я вызываю randomGen2, несмотря на то, что возвращаю Int, я получаю сообщение об ошибке о том, что мне не удалось напечатать Random (когда на самом деле я пытаюсь напечатать только Int).
<interactive>:3:1:
No instance for (Show (Random Int))
arising from a use of `print'
Possible fix: add an instance declaration for (Show (Random Int))
In a stmt of an interactive GHCi command: print it
Вот код:
import Control.Monad.State
type Seed = Int
randomGen :: Seed -> (Int, Seed)
randomGen seed = (seed,seed+1)
type Random a = State Seed a
randomGen2 :: Random Int
randomGen2 = do
seed <- get
let (x,seed') = randomGen seed
put seed'
return x
Любые идеи?
Обновление - ожидаемое поведение. Я надеюсь, что смогу что-то сделать с помощью интерпретатора (например, GHCI) -
> getRandomInit 1
> -- some other stuff, e.g. 2 + 3
> getRandom
то есть я могу настроить свою функцию getRandom с семенем, которое затем сохраняет семя, используя put
, затем эта функция возвращается и завершается. Затем я делаю что-то другое, затем снова вызываю getRandom, и семя извлекается из монады, где оно было сохранено.
getRandomInit
- этоSystem.Random.setStdGen
. Обратите внимание, чтоsetStdGen
принимаетStdGen
, а неInt
. Вы можете создать его изInt
с помощьюmkStdGen
.getRandom
этоSystem.Random.randomIO
. Ознакомьтесь с документацией для получения более подробной информации. Также имейте в виду, что если вам нужно глобальное состояние, оно должно находиться внутриIO
- вы не можете использоватьState
. - person user2407038   schedule 12.05.2014