我一個功能,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,必須聲明的Read
這Positive
東西的實例」。所以我就這麼做了,但是這個實例已經在quickCheck庫中聲明瞭,因爲ghci對我發出了尖叫。
在這一點上,我迷路了,因爲我沒有找到好的文檔(如果有的話)。
任何幫助我理解quickcheck庫中的修飾符和其他好東西的指針都會被讚賞。
沒有解析,因爲'rev(Positive {getPositive = 1})'是'read'} 1 = evitisoPteg {evitisoP「'。 –