data Mytype
= C1
| C2 Char
| C3 Int String
如果我case
在Mytype
一個Haskell數據類型而忘記處理的情況下,一個被遺忘的建設者,GHC給我警告(詳盡檢查)。
我現在想寫一個快速檢查Arbitrary
實例產生MyTypes
,如:
instance Arbitrary Mytype where
arbitrary = do
n <- choose (1, 3 :: Int)
case n of
1 -> C1
2 -> C2 <$> arbitrary
3 -> C3 <$> arbitrary <*> someCustomGen
這樣做的問題是,我可以添加一個新的替代Mytype
和忘記更新任意實例,從而有我測試不測試該替代方案。
我想找一種方法來使用GHC的詳盡檢查器來提醒我在我的任意實例中遺忘的案例。
我想出的最好的是
arbitrary = do
x <- elements [C1, C2 undefined, C3 undefined undefined]
case x of
C1 -> C1
C2 _ -> C2 <$> arbitrary
C3 _ _ -> C3 <$> arbitrary <*> someCustomGen
但它並沒有真正感受到優雅。
我直覺地認爲沒有100%乾淨的解決方案,但是會希望減少忘記這種情況的機會 - 特別是在代碼和測試分開的大項目中。
只是說明:可以寫'C2 {}'而不是'C2 _'等,這樣至少可以使語法更好一些。 – nh2 2014-08-28 19:59:52
請注意,如果構造函數嚴格,undefined將失敗。 – 2014-09-04 08:23:02
是否有某些原因,你不想只用TH自動導出任意實例? – 2014-09-04 18:52:02