2009-11-06 79 views
2

我工作過的第4章的 練習Real World Haskell一個是落實 concatfoldr基於版本。我認爲這將是一個很好的候選人用於測試 快速檢查,因爲有一個現有的實施來驗證我的 結果。然而,這需要我定義可以生成任意[[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

回答

3

[[Int]]已經是一個Arbitrary實例(因爲IntArbitrary實例,因此是[a]所有a S中的自己Arbitrary實例)。所以這不是問題。

我自己運行你的代碼(用fconcat = concat代替import FoldExcercises),它運行了200次測試,所以我很困惑它爲什麼不能爲你做。但是您不需要添加Arbitrary實例。

+0

我同意。這在OSX Leopard的ghc 6.10.4中適用於我 – barkmadley 2009-11-06 23:56:01