- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 HSpec 和 QuickCheck 来验证 Monoids 的属性(关联性和标识元素)。我将验证特定实例,但希望保留大部分代码的多态性。这是我几个小时后想到的:
module Test where
import Test.Hspec
import Test.QuickCheck
import Data.Monoid
instance (Arbitrary a) => Arbitrary (Sum a) where
arbitrary = fmap Sum arbitrary
instance (Arbitrary a) => Arbitrary (Product a) where
arbitrary = fmap Product arbitrary
prop_Monoid_mappend_mempty_x x = mappend mempty x === x
sumMonoidSpec = it "mappend mempty x = x" $ property (prop_Monoid_mappend_mempty_x :: Sum Int -> Property)
productMonoidSpec = it "mappend mempty x = x" $ property (prop_Monoid_mappend_mempty_x :: Product Double -> Property)
main :: IO ()
main = hspec $ do
describe "Data.Monoid.Sum" $ do
sumMonoidSpec
describe "Data.Monoid.Product" $ do
productMonoidSpec
monoidSpec = it "mappend mempty x = x" $ property prop_Monoid_mappend_mempty_x
src/Test.hs@18:42-18:50 No instance for (Arbitrary a0) arising from a use of property
The type variable a0 is ambiguous
Note: there are several potential instances:
instance Arbitrary a => Arbitrary (Product a)
-- Defined at /home/app/isolation-runner-work/projects/68426/session.207/src/src/Test.hs:10:10
instance Arbitrary a => Arbitrary (Sum a)
-- Defined at /home/app/isolation-runner-work/projects/68426/session.207/src/src/Test.hs:7:10
instance Arbitrary () -- Defined in Test.QuickCheck.Arbitrary
...plus 27 others …
src/Test.hs@18:51-18:79 No instance for (Monoid a0)
arising from a use of prop_Monoid_mappend_mempty_x
The type variable a0 is ambiguous
Note: there are several potential instances:
instance Monoid () -- Defined in Data.Monoid
instance (Monoid a, Monoid b) => Monoid (a, b)
-- Defined in Data.Monoid
instance (Monoid a, Monoid b, Monoid c) => Monoid (a, b, c)
-- Defined in Data.Monoid
...plus 18 others …
最佳答案
注意property :: Testable prop => prop -> Property
的类型.类型 var prop
被删除,如果类型变量不再可用,则无法进行实例解析。基本上你想要做的是推迟实例选择,为此你必须使类型可用,直到你选择实例的那一刻。
一种方法是随身携带一个额外的 Proxy prop
范围:
-- Possibly Uuseful helper function
propertyP :: Testable prop => Proxy prop -> prop -> Property
propertyP _ = property
monoidProp :: forall m . (Arbitrary m, Testable m, Show m, Monoid m, Eq m)
=> Proxy m -> Property
monoidProp _ = property (prop_Monoid_mappend_mempty_x :: m -> Property)
monoidSpec :: (Monoid m, Arbitrary m, Testable m, Show m, Eq m) => Proxy m -> Spec
monoidSpec x = it "mappend mempty x = x" $ monoidProp x
main0 :: IO ()
main0 = hspec $ do
describe "Data.Monoid.Sum" $ do
monoidSpec (Proxy :: Proxy (Sum Int))
describe "Data.Monoid.Product" $ do
monoidSpec (Proxy :: Proxy (Product Double))
tagged
这样的库。提供类型
Tagged
,它只是向现有类型添加一些幻影类型参数:
import Data.Tagged
type TaggedProp a = Tagged a Property
type TaggedSpec a = Tagged a Spec
monoidPropT :: forall a. (Monoid a, Arbitrary a, Show a, Eq a)
=> TaggedProp a
monoidPropT = Tagged (property (prop_Monoid_mappend_mempty_x :: a -> Property))
monoidSpecT :: forall a . (Monoid a, Arbitrary a, Show a, Eq a) => TaggedSpec a
monoidSpecT = Tagged $ it "mappend mempty x = x"
(unTagged (monoidPropT :: TaggedProp a))
main1 :: IO ()
main1 = hspec $ do
describe "Data.Monoid.Sum" $ do
untag (monoidSpecT :: TaggedSpec (Sum Int))
describe "Data.Monoid.Product" $ do
untag (monoidSpecT :: TaggedSpec (Product Double))
-XScopedTypeVariables
.
关于haskell - 使用 HSpec 和 QuickCheck 验证 Data.Monoid 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26428326/
我正在处理 Real WorldHaskell其中一个 第4章的练习是实现一个foldr基于版本的concat .我认为这将是一个很好的测试候选者 QuickCheck 因为有一个现有的实现来验证我的
我要延期 QuickCheck在测试失败时给我更好的信息(而不仅仅是种子)。例如,我希望能够按照以下方式创建内容: eqTest :: Eq a => a -> a -> TestResult eqT
有没有人确切地知道如何使用 QuickCheck 在 Haskell 中定义生成器,以便仅选择一次所选元素? 我已经意识到我可能需要一个“Gen(Maybe Positive)”生成器,但这当然会产生
我有以下要使用快速检查测试的属性: prop_zip xs ys = length xs == length ys ==> unzip (zip xs ys) == (xs,ys) 尽管根据
我有一个具有以下类型签名的函数 rndListIndex :: Double -> Double -> Double -> Double rndListIndex maxIdx r1 r2 = … 第
鉴于以下情况: test :: (Int -> Int) -> Int -> Bool test _ _ = True 编译源码后,我尝试运行quickCheck test : > quickChec
为什么没有QuickCheck功能类似于 hedgehog的 success ?特别是我想知道如何翻译如下属性: prop_specialPair :: Property prop_specialPa
我有一个如下所示的 QuickCheck 属性: prop42 :: Foo -> Bool prop42 foo = fn1 foo == fn2 foo 如果此属性失败,它将打印出 foo曾是。但
所以我有这个 quickCheck 命题逻辑生成器: instance Arbitrary Form where arbitrary = genForm genForm = sized genF
背景 为了好玩,我正在尝试编写一个用于快速检查的属性,以测试 cryptography with RSA 背后的基本思想。 . 选择两个不同的素数,p和 q . 让 N = p*q e是某个数字rel
我有一组对字符串进行编码/解码的简单演示程序,并希望为它们生成一些 quickCheck 测试,但将测试限制为仅可打印的字符串。由于生成和拒绝的测试用例太多,使用 guard 太慢并且失败,所以我想为
我有两个生成器,gen_n 和 gen_arr: gen_n :: Gen Int gen_n = suchThat arbitrary (\i -> i >= 0 && i i >= 0 && i
我面临着为生成器编写收缩函数的问题,该函数取决于另一个生成器输出的值。基本上是以下形式的生成器: do a Gen b g :: a -> b -> c 。为了便于论证,假设 g = (,) 。
我有一个数据类型定义: data Point = Point {x :: Int, h :: Int} | EmptyPoint 在我的属性测试中,我想将测试限制为仅针对 Point 构造函数案例。例
propertyForStringsFromMyCharPool :: String -> Bool -- implementation main = T.quickCheck propertyFor
我有一个类型类 Atomic,它定义了将某些类型与包装器值 (Atom) 相互转换的函数。我想定义一个 QuickCheck 属性,它声明:“对于 Atomic 的所有实例,可以安全地存储和检索任何值
tl;dr:如果您的数据类型允许太多嵌套,您如何编写不会爆炸的 Arbitrary 实例?您如何保证这些实例产生您的数据结构的真正随机样本? 我想生成随机树结构,然后在用我的库代码破坏这些结构后测试它
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题吗? 更新问题,以便 editing this post 提供事实和引用来回答它. 关闭 7 年前。 Improve
我正在尝试为身份编写一个 QuickCheck 测试 f $ y = f y 我最初的计划是编写一个返回函数和整数的任意生成器,签名为 Gen (Int -> Int, Int) 并且在 prop_D
我正在使用 Test.QuickCheck 生成随机数独谜题。 data Sudoku = Sudoku { getSudoku :: [[Maybe Int]] } deriving (Show,
我是一名优秀的程序员,十分优秀!