我有一个看起来像这样的数据类型:
phpbrew init --root=/opt/phpbrew
export PHPBREW_ROOT=/opt/phpbrew # php dist files and build files are stored here
export PHPBREW_HOME=/root/.phpbrew # your configuration files.
[[ -e ~/.phpbrew/bashrc ]] && source ~/.phpbrew/bashrc
phpbrew use php-7.2.12
echo "finished phpbrew setup"
我想创建一个data PageLogCommand = LogPage Page
| Stop (MVar ())
类型的生成器。
尽管对于Gen PageLogCommand
命令,制作一个新的空MVar的类型为Stop
,所以如何从IO (MVar a)
单子中提取MVar
并将其用于输入IO
类型?
答案 0 :(得分:2)
如何将MVar
作为参数传递给Gen
函数?喜欢
pageLogCommandGen :: MVar () -> Gen PageLogCommand
pageLogCommandGen stopMVar = oneof
[ LogPage <$> arbitrary
, pure (Stop stopMVar)
]
然后您可以在IO中生成stopMVar
并将其传递给
do stopMVar <- newEmptyMVar
plc <- generate (pageLogCommandGen stopMVar)
...
在测试属性之前。
答案 1 :(得分:0)
您can't extract a pure value from IO
。这是设计使然。
但是,您可以编写在IO
中运行的QuickCheck属性;像这样的东西:
myIOProperty :: Testable prop => IO prop
myIOProperty = do
mvar <- newEmptyMVar
-- do something with mvar here and return a result
然后使用ioProperty
或idempotentIOProperty
将IO prop
的值转换为Property
。