如何生成使用MVar的数据类型?

时间:2019-12-14 00:36:11

标签: haskell generator quickcheck

我有一个看起来像这样的数据类型:

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类型?

2 个答案:

答案 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

然后使用ioPropertyidempotentIOPropertyIO prop的值转换为Property