簡體   English   中英

沒有因使用“道具”而產生(任意自然)的實例

[英]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一個實例(就像ShowEq的實例一樣)。 我可能想出了如何做到這一點,但它看起來很亂而且不太奏效,然后我意識到我可以重寫測試以接受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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM