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