Haskell 如何修复类似列表类型的任意实例的歧义性
考虑以下几点:Haskell 如何修复类似列表类型的任意实例的歧义性,haskell,quickcheck,Haskell,Quickcheck,考虑以下几点: import Test.QuickCheck import Test.QuickCheck.Checkers import Test.QuickCheck.Classes data List a = Nil | Cons a (List a) deriving (Eq, Show) instance Functor List where fmap _ Nil = Nil fmap f (Cons a l) = Cons (f a) (fmap f l) in
import Test.QuickCheck
import Test.QuickCheck.Checkers
import Test.QuickCheck.Classes
data List a = Nil | Cons a (List a) deriving (Eq, Show)
instance Functor List where
fmap _ Nil = Nil
fmap f (Cons a l) = Cons (f a) (fmap f l)
instance Eq a => EqProp (List a) where (=-=) = eq
genList :: Arbitrary a => Gen (List a)
genList = do
n <- choose (3 :: Int, 5)
gen <- arbitrary
elems <- vectorOf n gen
return $ build elems
where build [] = Nil
build (e:es) = Cons e (build es)
instance Arbitrary a => Arbitrary (List a) where
arbitrary = frequency [ (1, return Nil)
, (3, genList)
]
main = quickBatch $ functor (Nil :: List (Int, String, Int))
我知道我可以把
genList
写成genList=Cons arbitral
,但我想知道。如何消除歧义?main
中的类型断言不应该清除它吗?vectorOf
需要一个gena
。因此,GHC试图为Gen a
找到一个不存在的任意
实例
使用任意n的向量
或只使用向量n
。此外,建议使用QuickCheck选择尺寸:
genList :: Arbitrary a => Gen (List a)
genList = sized $ \n ->
elems <- vector n
return $ build elems
where build [] = Nil
build (e:es) = Cons e (build es)
请注意,
genList=Cons arbitral
不会生成空列表,而foldr Cons Nil listOf arbitral
会生成空列表。您不是只想let gen=arbitral
?(或者,elems@Lee,我现在觉得自己很愚蠢。事实上,gen
不应该被“拆开”。
genList :: Arbitrary a => Gen (List a)
genList = sized $ \n ->
elems <- vector n
return $ build elems
where build [] = Nil
build (e:es) = Cons e (build es)
genList :: Arbitrary a => Gen (List a)
genList = build <$> listOf arbitary
where build = foldr Cons Nil