Haskell QuickCheck:TestTree中等价性检查的歧义类型变量问题
解决Haskell QuickCheck歧义类型约束问题
你遇到的问题核心是编译器无法推断空Deque的元素类型,进而无法确认Maybe a是否满足Eq约束(Eq (Maybe a)要求a本身属于Eq类型类)。以下是几种可行的解决方式:
方法1:直接给空Deque添加类型标注
明确指定空队列的元素类型(只要该类型自带Eq实例即可),比如用Int:
prop1 :: TestTree prop1 = QC.testProperty "read_empty" $ peekFront ([] :: Deque Int) == Nothing
[] :: Deque Int直接告诉编译器,这个空队列的元素类型是Int,因此peekFront []的类型是Maybe Int,和Nothing比较时就能满足Eq约束。
方法2:用ScopedTypeVariables保持多态性
如果想让属性适用于所有Eq类型的元素,可以启用ScopedTypeVariables扩展,明确类型约束:
{-# LANGUAGE ScopedTypeVariables #-} prop1 :: TestTree prop1 = QC.testProperty "read_empty" $ \(dq :: Deque a) -> null dq ==> peekFront dq == (Nothing :: Maybe a) where a :: Eq a => a a = undefined
通过ScopedTypeVariables让多态类型a在属性中可见,Eq a约束确保Maybe a满足Eq要求。
方法3:用TypeApplications指定类型参数
启用TypeApplications扩展后,可直接给peekFront指定元素类型:
{-# LANGUAGE TypeApplications #-} prop1 :: TestTree prop1 = QC.testProperty "read_empty" $ peekFront @Int [] == Nothing
@Int明确告知peekFront当前操作的Deque元素类型是Int,编译器会自动推导后续的Eq约束。
内容的提问来源于stack exchange,提问作者FacundoAlvarado
相关产品推荐
相关产品推荐

