Haskell不启用AllowAmbiguousTypes如何修复类型变量歧义问题
问题根源
你定义的Board类型别名中声明了类型参数a,但整个类型定义逻辑完全没有用到这个参数;同时你给new函数添加了Eq a约束,但函数实现也和a没有任何关联,编译器无法推断出a的具体类型,因此触发了歧义报错。
可行解决方案
方案1:删除无用的类型参数(最推荐)
如果你的Board本身不需要泛型支持,直接移除定义中冗余的a参数即可从根源解决问题:
-- 删掉无用的类型参数a type Board = [(Position, Char)] new :: [Char] -> Board new a = zip [NW,N,NE,W,M,E,SW,S] a ++ [(SE,'X')]
方案2:保留泛型参数的修复方式
如果后续业务逻辑确实需要Board带泛型参数,可以通过明确类型的方式解决:
方式A:添加哑参数传递类型信息
type Board a = [(Position, Char)] -- 新增第二个参数,用于给编译器传递a的类型信息 new :: (Eq a) => [Char] -> a -> Board a new chars _ = zip [NW,N,NE,W,M,E,SW,S] chars ++ [(SE,'X')]
调用时传入对应类型的哑值即可让编译器确定a的类型。
方式B:开启扩展延后歧义检查(临时救急用,不推荐长期使用)
在文件头部添加扩展声明,将歧义检查延后到函数调用阶段:
{-# LANGUAGE AllowAmbiguousTypes #-}
开启后调用new函数时需要通过类型应用明确指定a的类型,示例:new @Int "abcdefgh"。
内容的提问来源于stack exchange,提问作者user17480759
相关产品推荐
相关产品推荐

