我試圖使用HSpec和QuickCheck來驗證屬性的猿(關聯性和標識元素)。我要驗證特定的實例,但想保留大部分代碼多態。這是我想出了幾個小時後:使用HSpec和QuickCheck驗證Data.Monoid屬性
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/[email protected]: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/[email protected]: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 …
我知道我需要約束在多態版本的幺半羣是任意的,Eq和顯示,但我不知道如何。
問題是如何以多態方式表達Monoid的規格並避免代碼重複?
您可能有興趣使用[hspec-laws](https://github.com/hspec/hspec-laws#readme)或[hspec-checkers](http://hackage.haskell.org/package/取而代之的是hspec-checkers)。 – 2014-11-01 05:26:20