Haskell 快速检查规范DSL

Haskell 快速检查规范DSL,haskell,quickcheck,hspec,Haskell,Quickcheck,Hspec,我想创建一个非haskell程序员能够理解的可读DSL,用于创建外部系统黑盒测试规范 我想知道这样的事情在哈斯克尔是否可行 action = readProcess "sleep 1; print success" prop_action = monadicIO $     within 100000 >>=     repliesWith (== "success") within :: Int -> IO a -> IO within t = fromMaybe

我想创建一个非haskell程序员能够理解的可读DSL,用于创建外部系统黑盒测试规范

我想知道这样的事情在哈斯克尔是否可行

action = readProcess "sleep 1; print success"

prop_action = monadicIO $
    within 100000 >>=
    repliesWith (== "success")

within :: Int -> IO a -> IO
within t = fromMaybe False $ timeout t

repliesWith :: (a -> Bool) -> IO a -> IO Bool
repliesWith v = liftM v
这里我给出一个伪代码,用于检查操作是否会在0.1秒内返回值“success”。似乎我需要某种monad,它会在错误值上短路,以链接多个检查,将值从一个传递到另一个


感觉像这样的东西应该存在。也许您可以建议一个库或如何在Haskell中实现我的想法。

可以,但您的语法不正确。您希望在x内
您的操作
,而不是在x内
=您的操作
<然后,用叉子和超时就可以轻松实现
内的code>。其思想是连锁检查,而不是在
内创建和执行hoc
。例如,我们可以想象
before
状态,该状态表示下一个操作应该在另一个并行操作之前发生,如果是,则将结果传递给另一个检查。我相信没有必要用叉子
Control.Concurrent.timeout
已经做了我需要的事情。那是因为
timeout
为你做了分叉;我不是说你必须特别使用
forkIO
。@Cubic是的,好的。我的问题仍然没有答案。我可以创建一种复合的一元属性吗?DSL对于非haskell程序员来说是可读的。如果我不能,我只是想确定一下。如果你将
中的
类型更改为
中的IO Bool->IO Bool
monadicIO$within 100000>=回复(=“success”)
monadicIO,那么你写的东西就可以了。10万以内。回答(=“success”)$theActionYouWantToTest
。如果你想做更多的事情,你必须详细说明。可能是的,但你的语法是错的。您希望在x内
您的操作
,而不是在x内
=您的操作
<然后,用叉子和超时就可以轻松实现
内的code>。其思想是连锁检查,而不是在
内创建和执行hoc
。例如,我们可以想象
before
状态,该状态表示下一个操作应该在另一个并行操作之前发生,如果是,则将结果传递给另一个检查。我相信没有必要用叉子
Control.Concurrent.timeout
已经做了我需要的事情。那是因为
timeout
为你做了分叉;我不是说你必须特别使用
forkIO
。@Cubic是的,好的。我的问题仍然没有答案。我可以创建一种复合的一元属性吗?DSL对于非haskell程序员来说是可读的。如果我不能,我只是想确定一下。如果你将
中的
类型更改为
中的IO Bool->IO Bool
monadicIO$within 100000>=回复(=“success”)
monadicIO,那么你写的东西就可以了。10万以内。回答(=“success”)$theActionYouWantToTest
。如果你想得到更多的东西,你必须详细说明。
action = readProcess "sleep 1; print success"

prop_action = monadicIO $
    within 100000 >>=
    repliesWith (== "success")

within :: Int -> IO a -> IO
within t = fromMaybe False $ timeout t

repliesWith :: (a -> Bool) -> IO a -> IO Bool
repliesWith v = liftM v