2012-09-17 42 views
7

我一個功能,rev,對於一個類型,有三種類型類返回一些值:如何(在我的情況正)使用改性劑與快速檢查

rev :: (Integral a, Show a, Read a) => a -> a 
rev = read . reverse . show 

我想測試一些財產關於它與quickcheck。雖然,我對測試Integral類型的負值不感興趣,因爲我在基本庫中使用Integer類型缺少Natural類型。所以我想,讓我們產生的價值相反時產生的值是負的,我會被罰款:

prop_id :: (Integral a, Show a, Read a) => Positive a -> Bool 
prop_id n | n >= 0 = (rev.rev) n == n 
      | otherwise = let n' = -n in (rev.rev) n' == n' 

(測試的屬性在這裏並不重要 - 尤其是它並不適用於非常基本的價值觀,我意識到這一點,這不是這個問題的主題)

然後,我碰到了Positive修飾符,並認爲,雖然我的測試現在函數,它會很好實現它在一個更好的方式。所以我試過了:

prop_id :: (Integral a, Show a, Read a) => Positive a -> Bool 
prop_id n = (rev.rev) n == n 

我必須承認編輯時我很驚訝。但隨後的錯誤運行測試時彈出:

*** Failed! Exception: 'Prelude.read: no parse' (after 1 test): 
Positive {getPositive = 1} 

所以我想,「MMK,必須聲明的ReadPositive東西的實例」。所以我就這麼做了,但是這個實例已經在quickCheck庫中聲明瞭,因爲ghci對我發出了尖叫。

在這一點上,我迷路了,因爲我沒有找到好的文檔(如果有的話)。

任何幫助我理解quickcheck庫中的修飾符和其他好東西的指針都會被讚賞。

+5

沒有解析,因爲'rev(Positive {getPositive = 1})'是'read'} 1 = evitisoPteg {evitisoP「'。 –

回答

17

使用這些修飾符的常用方法是對它們進行模式匹配,例如,

prop_id :: (Integral a, Show a, Read a) => Positive a -> Bool 
prop_id (Positive n) = (rev.rev) n == n 

這樣,n將具有基礎類型。

+0

等等,甚至沒有想到要嘗試。傻我。謝謝 :) – m09

相關問題