我正在嘗試為二進有理數的實作撰寫以下測驗。
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( 就像一個 forShow和Eq)的實體。我可能想出了如何做到這一點,但它看起來很亂而且不太好用,然后我意識到我可以重寫測驗以接收Integers 和Naturals。
但是,我收到了相同的錯誤訊息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習慣的方法來做到這一點?
uj5u.com熱心網友回復:
大量這些型別在包quickcheck-instances 中實作。只需將其添加到您的依賴項中,import Test.QuickCheck.Instances.Natural就可以了!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/352621.html
