haskell隐藏了star-operator的导入

时间:2018-06-07 21:15:41

标签: haskell

我有:

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 *

编辑:描述目前无法重现。我会尽快更新问题。

1 个答案:

答案 0 :(得分:8)

GHC.TypesGHC.TypeNats都没有(*)导出。他们都有type (*)出口。通常,您可以按上下文区分术语级(*)和类型级(*),但在导出/导入列表中不是这样。相反,术语级别被视为默认值,您必须明确表示要隐藏类型。

import qualified GHC.Types as T hiding (Module, type (*))
import GHC.TypeNats hiding (type (*))

Module保持原状的原因是因为大写意味着它必须是类型,构造函数或模式同义词。构造函数必须出现在其数据类型旁边的分组()内,并且模式同义词必须与pattern分开,因此上面的Module用于引用数据类型(隐藏数据) type也隐藏了它的所有构造函数。)

当您尝试隐藏不存在的内容时没有收到错误的原因是因为hiding被设计为如果导入的模块已经停止导出您隐藏的内容,则模块不会失败编译。毕竟,你引用那个东西的唯一原因就是说你不会引用那个东西。