Пусть имеем:
data Contract = Contract {number::String, positions::[Pos]}
data Pos = Pos {unit::Unit, cost::Int}
data Unit = Unit {unit::String, minCost::Int, maxCost::Int}
gen :: Gen String -> Gen Unit -> Gen Unit -> Gen Contract
gen numberG mainUnitG otherUnitG = liftM2 numberG (sequence [posG mainUnitG, posG otherUnitG])
where posG :: Gen Unit -> Gen Pos
posG u = liftM2 Pos u (choose (0, 100))
А как мне определить posG, так, чтобы позиция генерировалась с
с ценой, согласно диапазону, взятому из единицы учета (unit-а)?
Здравствуйте, nlv, Вы писали:
Ошибки в коде — две функции unit с разными сигнатурами, отсутствует Contract после liftM2, хотя по смысле, конечно, можно догадаться.
Попробуй напрямую:
gen :: Gen String -> Gen Unit -> Gen Unit -> Gen Contract
gen numberG mainUnitG otherUnitG = liftM2 Contract numberG (sequence [posG mainUnitG, posG otherUnitG])
where posG :: Gen Unit -> Gen Pos
posG uG = do
u@(Unit _ min max) <- uG
cost <- choose (min, max)
return $ Pos u cost
Здравствуйте, lomeo, Вы писали:
L>Здравствуйте, nlv, Вы писали:
L>Ошибки в коде — две функции unit с разными сигнатурами, отсутствует Contract после liftM2, хотя по смысле, конечно, можно догадаться.
L>Попробуй напрямую:
L>L>gen :: Gen String -> Gen Unit -> Gen Unit -> Gen Contract
L>gen numberG mainUnitG otherUnitG = liftM2 Contract numberG (sequence [posG mainUnitG, posG otherUnitG])
L> where posG :: Gen Unit -> Gen Pos
L> posG uG = do
L> u@(Unit _ min max) <- uG
L> cost <- choose (min, max)
L> return $ Pos u cost
L>
Да, так и надо делать, что-то сразу не сообразил, спасибо!
И еще вопрос.
Новые типы (Pos, Unit и т.п.) я могу определить, как экземляры класса arbitrary и использовать функцию quickCheck для
автоматического тестирования.
А если я хочу генерировать позиции с единицами учета список которых задан в файле, как лучше поступить?
Сейчас я пишу функции, что-то вроде contractGen :: FilePath -> IO Gen Contract, ну и данные генерирую
посредством функции generate.
Соответственно, а можно ли в этом случае
задействовать автоматическое тестирование при помощи quickCheck-а?