Знатокам quickcheck haskell вопрос по генерации данных
От: nlv  
Дата: 27.10.09 07:43
Оценка:
Пусть имеем:

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-а)?
Re: Знатокам quickcheck haskell вопрос по генерации данных
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 27.10.09 08:13
Оценка:
Здравствуйте, 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
Re[2]: Знатокам quickcheck haskell вопрос по генерации данны
От: nlv  
Дата: 27.10.09 08:32
Оценка:
Здравствуйте, 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-а?
Re[3]: Знатокам quickcheck haskell вопрос по генерации данны
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 27.10.09 10:23
Оценка:
Здравствуйте, nlv, Вы писали:

nlv>А если я хочу генерировать позиции с единицами учета список которых задан в файле, как лучше поступить?


nlv>Сейчас я пишу функции, что-то вроде contractGen :: FilePath -> IO Gen Contract, ну и данные генерирую

nlv>посредством функции generate.
nlv>Соответственно, а можно ли в этом случае
nlv>задействовать автоматическое тестирование при помощи quickCheck-а?

Не сталкивался с таким. Может быть instance Arbitrary (IO Unit) попробовать? Иначе только через unsafePerformIO. В принципе, так как это один раз, то можно.
Re[4]: Знатокам quickcheck haskell вопрос по генерации данны
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 27.10.09 10:32
Оценка:
Здравствуйте, lomeo, Вы писали:

L>Не сталкивался с таким. Может быть instance Arbitrary (IO Unit) попробовать? Иначе только через unsafePerformIO. В принципе, так как это один раз, то можно.


Нет, IO Unit не надо — автоматически не повытаскиваешь генератор для Unit. Используй unsafePerformIO. Тут для него самое место.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.