修复QuickCheck验证BinTree Applicative同态律的类型推导错误
修复Applicative同态性测试的类型歧义问题
错误原因
编译器报错的核心是类型歧义:你的apHomomorphismProp是适用于任意Applicative f的多态函数,但在main中调用时,没有明确指定要测试的具体Applicative实例(即你定义的BinTree),导致编译器无法推断f的具体类型,从而产生未确定的f0类型变量。
修复方案
以下是两种简洁有效的修复方式:
方案一:使用类型应用明确指定实例(推荐)
- 在文件顶部添加
TypeApplications扩展:
{-# LANGUAGE ViewPatterns #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} -- 新增该扩展
- 修改
main函数,通过@符号显式指定f为BinTree,a和b为Int:
main :: IO () main = quickCheck (apHomomorphismProp @BinTree @Int @Int)
方案二:定义针对BinTree的具体测试函数
直接将测试函数绑定到BinTree实例,避免多态歧义:
-- 专门针对BinTree的同态性测试 apHomomorphismPropBinTree :: Fun Int Int -> Int -> Bool apHomomorphismPropBinTree (apply -> g) x = ((pure g :: BinTree (Int -> Int)) <*> (pure x :: BinTree Int)) == (pure (g x) :: BinTree Int) main :: IO () main = quickCheck apHomomorphismPropBinTree
验证修复
修改完成后,编译器能明确识别要测试的BinTree实例,类型歧义消除,即可正常运行QuickCheck测试。
内容的提问来源于stack exchange,提问作者F. Zer
相关产品推荐
相关产品推荐

