2010-12-06 2 views
2

안녕하세요 다음 코드기능 변수하지 하스켈

import Data.Maybe 
import Test.QuickCheck 
import System.Random 


rndExpr :: Gen Expr -> IO Expr 
rndExpr gen = do 
    rnd <- newStdGen 
    return (generate 5 rnd gen) 

하지만 난이 ""범위에 포함되지 "발생 수는 왜 그렇게?

감사 대런

편집입니다했다 Test.QuickCheck를 가져오고 있지만 "생성 중"에 대한 불만은 아직 범위에 없습니다.

편집 2

Quickcheck 버전 2에서 작동하도록 어떻게이 함수를 작성 하시겠습니까? 나는 간단한없는 succsess로했다 생성 "unGen"를 넣어 시도, 나는 또한 설치 quickcheck의 2 절

나는 다음과 같은 속성 stdGen->Gen Expr->Expr' 및 unGen과 기능을 필요로 저를 줄 것 같다 (도당은 QuickCheck-2.1.0.3 설치) 기능,하지만 내가 말했듯이, 내 컴파일러는 그 기능을 찾지 못할 수 있습니다. 이 문제에 사용할 수있는 다른 기능이 있습니까?

+0

수정 사항이 여전히 불완전한 정보를 제공합니다. Quickcheck의 어떤 버전을 사용하고 있습니까? QuickCheck2는 afaik를 생성하지 않습니다. 코드 조각은 QC1에서 찾을 수 있습니다. 유니 코드 화살표를 수정하고 (그렇게하지 마십시오)'type Expr = Int'를 추가하십시오. –

+0

어떤 버전의 메신저를 어떻게 사용하는지 확인하지는 않지만, 메신저는 버전 1을 사용한다고 가정하고 따라서 quickcheck에서 "generate"함수를 사용하려고합니다. 그러나 Im이 내 질문을 변경하면이 기능을 작성하는 다른 방법이 있습니까? – Darren

답변

1

generateSystem.Random의 기능이 아닙니다. 아마도 next을 찾고 계시겠습니까?

편집 : 분명히 말하자면 : 나는 당신이 임의/모나드 랜덤이 더 적합한 것처럼 보이는 작업에 대해 빠른 검사/임의 검색을 사용하는 이유를 알지 못합니다. 나는 당신이 당신의 선택을 고려하고 계속 나아갈 것이라고 생각할 것입니다.

발전기를 선택해야합니까? sample' :: Gen a -> IO a을 사용할 수 없습니까?

getVal :: IO a 
getVal = sample' arbitrary 

이것은 QC2에서 작동합니다.

OTOH, 당신은 정말 자신의 StdGen (또는 IO를 피하려고)를 시도 사용할 경우 :

import System.Random 
import Test.QuickCheck 
import Test.QuickCheck.Gen 

func :: StdGen -> Int 
func g = unGen arbitrary g 0 

이것은 StdGen 이름 g 및 카운트 사용합니다 (여기 0을)를 생성하기 위해 값. unGen이 생성기를 단계별로 실행하지 않기 때문에 카운터 스테핑이 좋은 임의성 속성을 제공하지 않으므로 (사용자가 직접 시도하고 볼 수있는 것처럼 보임) 결국 StdGen (yuck)을 생성하는 무언가로이 래핑을 수행하려고 할 수 있습니다. 당신은 당신이 실행 한 후 사용중인 버전의 패키지를 알 수없는 경우

: 나는 모두 1, 2,하지만이 숨겨져 있습니다 (위 본) 내 설정에서

$ ghc-pkg list | grep QuickCheck 
(QuickCheck-2.1.1.1) 
QuickCheck-1.2.0.1 

을합니다 (() 숨겨진 의미) 그래서 GHCi를 사용하고 Test.QuickCheck을 가져올 때 버전 1이됩니다.

+0

당신이 내 문제를 해결해 주셔서 감사합니다 :) – Darren

+0

일반적으로 허용되는 대답 옆에있는 체크 표시를 클릭하십시오. 여기에 어떤 사람들은 냉담하고 당신이 받아들이지 않고 너무 많은 것을 보았다면 당신의 질문에 대답하지 않을 것입니다. –

1

Test.QuickCheck에서 생성자를 사용하고 있으며 quickCheck의 버전 1에서 함수를 생성하는 것처럼 보입니다. quickCheck의 버전 2에서는 사소한 차이가있어 그러한 기능이 없습니다. 그러나이어야은 Test.QuickCheck를 가져올 필요가 있고, 유사한 기능은 다음과 같이 unGen에서 입수 할 수있다 : 당신이 너무 것을 가져 그래서

rundExpr gen = fmap (flip (unGen gen) 5) newStdGen 

unGen이 Test.QuickCheck.Gen에 유의하시기 바랍니다.