2015-10-16 2 views
1

Я действительно не понимаю связи между функцией и результатами, которые она создает. У меня есть следующий код HaskellНевозможно понять связь между результатами и функцией

data Expr = Num Integer | Add Expr Expr | Mul Expr Expr 

genExpr' :: Gen Expr 
genExpr' = frequency 
    [ (1, do n <- arbitrary 
       return (Num n) 
    ) 
    , (1, do a <- genExpr (1 `div` 2) 
       b <- genExpr (1 `div` 2) 
       return (Add a b) 
    ) 
    , (1, do a <- genExpr (1 `div` 2) 
       b <- genExpr (1 `div` 2) 
       return (Mul a b) 
    ) 
    ] 

Он генерирует следующие результаты в консоли, когда я запускаю «образец genExpr '»

0*0 
-2 
-1 
1*-3 
-1+-6 
-7*1 
9*10 
10+3 
-8+15 
2*-3 
-13 

И что делает результаты, чтобы быть в общей сложности 11 ??

+1

Где находится "Gen"? – MathematicalOrchid

ответ

4

[Для контекста, я предполагаю, что вы имеете в виду Gen, как это определено в QuickCheck библиотеке.]

вы видите выход имеет столько же общего с sample, чем с генератором вы написали.

Определение sample является:

-- | Generates some example values and prints them to 'stdout'. 
sample :: Show a => Gen a -> IO() 
sample g = 
    do cases <- sample' g 
    mapM_ print cases 

-- | Generates some example values. 
sample' :: Gen a -> IO [a] 
sample' g = 
    generate (sequence [ resize n g | n <- [0,2..20] ]) 

Так sample принимает генератор, запускает вспомогательную функцию sample' на нем, а затем печатает все результаты sample' на экране.

Функция sample принимает генератор и использует generate для «вызова» его несколько раз при разных размерах (с использованием resize). Сколько раз определяется пониманием списка. Понимание списка использует входные размеры [0,2..20], который является списком, расширяющимся до 11 элементов. Вот почему вы в конечном итоге видите 11 результатов.

Таким образом, вы в конечном счете получаете 11 случайных значений, сгенерированных с использованием вашего генератора.

+0

Значит, это всегда будет 11 элементов? @kosmikus. И если бы я хотел бы выбрать любой из возвращенных 11 элементов, было бы логично назвать head $ sample genExpr '? –

+0

Функция 'sample' существует только для целей отладки. Да, он всегда будет генерировать и распечатывать 11 элементов. Если вы обычно используете генератор в QuickCheck, QuickCheck будет использовать его для создания как можно большего количества элементов. – kosmikus

Смежные вопросы