如何从Test.QuickCheck模块显式导入Fn模式?
问题原因与解决方案
可以显式导入这类模式同义词,你之前导入报错的核心原因是:Fn是通过GHC的PatternSynonyms特性定义的模式同义词,不属于普通顶层值,也不是数据类型声明内自带的普通构造器,Haskell要求显式导入/导出这类标识符时,必须加pattern关键字做标识。
正确写法
首先你需要在文件顶部开启对应语言扩展(不管用全量导入还是显式导入,只要用到Fn模式都需要开这个扩展,全量导入时不会在导入阶段报错,只会在使用Fn时提示缺失扩展):
{-# LANGUAGE PatternSynonyms #-}
如果只需要导入Fn模式,导入语句写为:
import Test.QuickCheck (pattern Fn)
如果需要同时导入Fun类型和Fn模式,导入语句写为:
import Test.QuickCheck (Fun, pattern Fn)
之前写法错误的说明
- 直接写
import Test.QuickCheck (Fn):GHC只会在普通值、类型构造器的命名空间里查找Fn,找不到对应的模式同义词,直接报模块不导出该标识符的错误。 - 写
import Test.QuickCheck (Fun(Fn)):这是导入数据类型下属普通构造器的语法,仅对data/newtype声明时直接定义的构造器生效,Fn是后续单独为Fun类型定义的模式同义词,不是Fun的原生构造器,因此这个写法同样找不到对应标识符。
内容的提问来源于stack exchange,提问作者mherzl
相关产品推荐
相关产品推荐

