我有:
import qualified GHC.Types as T hiding (Module, (*))
import GHC.TypeNats hiding ((*))
但是当我尝试定义(*)
- 运算符时,它失败了:
{-# INLINE (*) #-}
infixl 7 *
(*) :: r -> r -> r
(*) = undefined
与
error:
Ambiguous occurrence ‘*’
It could refer to either ‘T.*’,
imported qualified from ‘GHC.Types’ at ...
or ‘*’,
imported from ‘GHC.TypeNats’ at ...
|
1277 | infixl 7 *
编辑:描述目前无法重现。我会尽快更新问题。
答案 0 :(得分:8)
GHC.Types
和GHC.TypeNats
都没有(*)
导出。他们都有type (*)
出口。通常,您可以按上下文区分术语级(*)
和类型级(*)
,但在导出/导入列表中不是这样。相反,术语级别被视为默认值,您必须明确表示要隐藏类型。
import qualified GHC.Types as T hiding (Module, type (*))
import GHC.TypeNats hiding (type (*))
Module
保持原状的原因是因为大写意味着它必须是类型,构造函数或模式同义词。构造函数必须出现在其数据类型旁边的分组()
内,并且模式同义词必须与pattern
分开,因此上面的Module
用于引用数据类型(隐藏数据) type也隐藏了它的所有构造函数。)
当您尝试隐藏不存在的内容时没有收到错误的原因是因为hiding
被设计为如果导入的模块已经停止导出您隐藏的内容,则模块不会失败编译。毕竟,你引用那个东西的唯一原因就是说你不会引用那个东西。