[英]Why does “No instance for (Arbitrary) arising from a use of `quickCheck'” error appears?
[英]No instance for (Arbitrary Natural) arising from a use of ‘prop’
我正在嘗試為二進有理數的實現編寫以下測試。
import Numeric.Natural
import Test.Hspec
import Test.Hspec.QuickCheck
import Dyadics
dyadic_add :: Integer -> Natural -> Integer -> Natural -> Bool
dyadic_add n1 p1 n2 p2 =
dyadic_to_rational (d1 `plus` d2) == (dyadic_to_rational d1) + (dyadic_to_rational d2) where
d1 = Dyadic n1 p1
d2 = Dyadic n2 p2
main :: IO ()
main = hspec $ do
describe "Dyadic properties" $ do
prop "dyadics add like rationals" $ dyadic_add
我對haskell很陌生,所以我幾乎不明白我在這里做什么。
我首先用這個簽名寫了測試; dyadic_add :: Dyadic -> Dyadic -> Bool
。 鑒於我的數據類型只是data Dyadic = Dyadic Integer Natural
,我認為生成隨機 Dyadics 是 QuickCheck 可以弄清楚如何做的事情,但顯然不是 - 我收到錯誤No instance for Test.QuickCheck.Arbitrary.Arbitrary Dyadic arising from a use of 'prop'
。
我發現這意味着我需要將 Dyadics 實現為Arbitrary
一個實例(就像Show
和Eq
的實例一樣)。 我可能想出了如何做到這一點,但它看起來很亂而且不太奏效,然后我意識到我可以重寫測試以接受Integer
s 和Natural
s。
但是,我收到了與Natural
相同的錯誤消息; No instance for (QuickCheck-2.14.2:Test.QuickCheck.Arbitrary.Arbitrary Natural) arising from a use of 'prop'
。 這讓我很驚訝——QuickCheck 真的不知道如何生成任意的Natural
嗎? 我想我也許可以弄清楚如何做到這一點,但我覺得 QuickCheck 中有很多預先存在的函數,我可能應該改用它們,而且我也遇到了解析 Haskell 的能力嘗試閱讀 QuickCheck 示例代碼時。 什么是最好/最簡單/最符合haskell習慣的方法來做到這一點?
大量這些類型在包quickcheck-instances 中實現。 只需將其添加到您的依賴項中, import Test.QuickCheck.Instances.Natural
,您就可以開始使用了!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.