>

두 번째 runRand에 도달하면 다음 코드가 정지됩니다. 왜요?

import Control.Monad.Random (Rand, getRandom, runRand)
import System.Random        (RandomGen, mkStdGen)
rgen :: (RandomGen g) => Rand g [Int]
rgen = do
    r <- sequence (repeat getRandom)
    return $ take 5 r
main = do
  let g0 = mkStdGen 0
      (i,g1) = runRand rgen g0 
  print i
  print "one done"
  let (j,_) = runRand rgen g1 
  print j

이 질문에 대한 답변을 바탕으로 : 무한 임의의 시퀀스는 randomIO로 루프하지만 getRandom에서는 그렇지 않습니다 이 프로그램이 종료 될 수 있도록 getRandom의 게으른 특성을 예상했을 것입니다.

  • 답변 # 1

    g1 의 가치를 요구  본질적으로 무한 횟수로 실행 된 후 난수 생성기의 상태를 묻습니다.

    sequence 의 타입 시그니처를 전문화하면 이것이 사실이라는 것을 알 수 있습니다. :

    sequence :: [Rand g Int] -> Rand g [Int]
    
    

    와이즈 비즈  그것이주는 목록은 무한하지만단일난수 생성기 상태 ( Int )를 돌려줍니다.  서명에). 이것은 모든 g 를 얻기에 충분한 시간을 실행 한 후 발전기의 상태 여야합니다. 목록에 있습니다 (여기서 무한 횟수).

    Int

  • 이전 webview - 웹 서버가 오프라인 인 경우 Android 앱에 오류 메시지가 표시됨
  • 다음 javascript - Movie DB API에서 데이터 무작위 화