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