我工作過的第4章的 練習Real World Haskell一個是落實 concat
的foldr
基於版本。我認爲這將是一個很好的候選人用於測試 快速檢查,因爲有一個現有的實施來驗證我的 結果。然而,這需要我定義可以生成任意[[Int]]
的類型類型的實例。到目前爲止,我有 一直無法弄清楚如何做到這一點。我的第一個嘗試是:正在執行生成Int的列表的列表與快速檢查
module FoldExcercises_Test
where
import Test.QuickCheck
import Test.QuickCheck.Batch
import FoldExcercises
prop_concat xs =
concat xs == fconcat xs
where types = xs ::[[Int]]
options = TestOptions { no_of_tests = 200
, length_of_tests = 1
, debug_tests = True }
allChecks = [
run (prop_concat)
]
main = do
runTests "simple" options allChecks
這導致沒有測試。縱觀各個位和 件我猜這是需要一個Arbitrary
實例聲明和 加入
instance Arbitrary a => Arbitrary [[a]] where
arbitrary = sized arb'
where arb' n = vector n (arbitrary :: Gen a)
這導致ghci中說我的實例聲明是無效的 並添加-XFlexibleInstances可以解決我的問題。 添加{-# OPTIONS_GHC -XFlexibleInstances #-}
指令 會導致類型不匹配和重疊實例警告。
所以我的問題是什麼需要做這項工作?對於Haskell,我顯然是新的 ,我沒有找到任何幫助我的資源。 任何指針,非常感謝。
編輯
看來我被快速檢查的輸出誤導時,在測試第一方式fconcat
被定義爲
fconcat = undefined
實際執行函數正確確實給出了預期的結果。 DOOP!
我同意。這在OSX Leopard的ghc 6.10.4中適用於我 – barkmadley 2009-11-06 23:56:01