Haskell使用Map.empty定义模式同义词报错“Qualified name in binding position”
解决Haskell模式同义词中限定名称的绑定错误
你遇到的这个编译错误,核心原因是Haskell的模式同义词规则里,绑定位置(也就是模式=右侧的构造部分)不允许直接使用带模块前缀的限定名称——哪怕Map.empty的类型完全匹配StoreEnv里的Map类型也不行。
两种可行的解决方法:
方法1:将限定常量绑定到本地非限定名称
先把Map.empty赋值给一个本地定义的非限定变量,再把这个变量用在模式同义词里,绕开限定名称的限制:
{-# Language PatternSynonyms #-} import qualified Data.Map as Map newtype StoreEnv = StoreEnv (Map.Map Int String) deriving (Eq, Show) -- 先把限定的Map.empty绑定到本地非限定变量 emptyMap :: Map.Map Int String emptyMap = Map.empty pattern EmptyStore :: StoreEnv pattern EmptyStore = StoreEnv emptyMap
方法2:调整导入方式,直接导入需要的常量
如果你不需要对empty使用限定前缀,可以直接从Data.Map导入这个常量,这样就能在模式里直接使用:
{-# Language PatternSynonyms #-} import Data.Map (Map, empty) import qualified Data.Map as Map -- 保留限定导入用于其他Map操作 newtype StoreEnv = StoreEnv (Map Int String) deriving (Eq, Show) pattern EmptyStore :: StoreEnv pattern EmptyStore = StoreEnv empty
补充说明
这两种方法都能让你正常使用EmptyStore模式:不管是匹配空的StoreEnv,还是用它构造空的StoreEnv,都能正常工作。本质上都是让模式同义词的构造部分使用非限定的名称,符合Haskell的语法规则。
内容的提问来源于stack exchange,提问作者Tien Ho
相关产品推荐
相关产品推荐

