HSpec 및 QuickCheck를 사용하여 Monoids (연관성 및 신원 요소)의 등록 정보를 확인하려고합니다. 특정 인스턴스를 확인하려고하지만 대부분의 코드를 다형성으로 유지하려고합니다. (그래도 난하고 싶은 무엇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
과 실제 모노 이드 예 (합계, 제품)과 유형을 지정을 다형성 지능 : 이것은 내가 몇 시간 후 해낸 것입니다 , Double) 나중에. 문제는 유형 검사를하지 않는다는 것입니다. 나는 계속 간다.
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 …
나는 제한이 있어야한다는 것을 알고있다. 다형성 버전에서 임의성, 이퀄라이제이션 및 쇼가되어야한다. 그러나 나는 어떻게해야할지 모른다.
문제는 다형성 방식으로 Monoid에 대한 스펙을 표현하고 코드 중복을 피하는 방법입니다.
[hspec-laws] (https://github.com/hspec/hspec-laws#readme) 또는 [hspec-checkers] (http://hackage.haskell.org/package/)를 사용하는 것이 좋습니다. hspec-checkers)를 사용하십시오. –