У меня есть следующий код
fastShuffle :: [a] -> IO [a]
fastShuffle a = <some code>
prop_fastShuffle_correct :: [Int] -> Property
prop_fastShuffle_correct s =
monadicIO ( do
sh <- run (fastShuffle s)
return ( True ==> ( insertionSort sh == insertionSort s &&
if length s > 10
then s /= sh
else True ) ) )
И.. это работает. Я не могу понять, как то, что выглядит как чистая функция (prop_fastShuffle_correct
), может вызывать не чистую функцию с побочными эффектами (fastShuffle
).
Надеюсь, что кто-то может объяснить.
Спасибо!
Property
, похоже, чтоProperty
включает в себя конструктор, который хранит значениеIO
. - person bradrn   schedule 05.03.2020IO
в своем определении. Из-за этого они могут разрешить функцию типаmonadicIO
, выполняющую действиеIO
и возвращающую тип библиотеки.Property
QuickCheck является одним из этих типов: он должен использоватьIO
в своем (непрозрачном) определении, иначе QuickCheck никогда не сможет протестировать действия ввода-вывода, подобные вашемуfastShuffle
. - person chi   schedule 05.03.2020