20

我在两个想要使用相同中缀运算符 ( <*>) 的不同 Haskell 模块之间发生了名称冲突。Haskell 98 报告说

modid.varsym

是允许的,但我无法让它工作。这里的全部内容是Test.hs

module Test
where

import qualified Test2 as T

three = T.<*>

Test2.hs

module Test2
where
(<*>) = 3

但是尝试编译会导致错误消息:

Test.hs:6:12: parse error on input `T.<*>'

我试过T.(<*>)了,但这也不起作用。

如何引用在导入的模块中定义的符号名称import qualified

4

2 回答 2

20

尝试

three = (T.<*>)

将中缀运算符定义为整数很奇怪。让我们考虑\\(集合差分运算符):

import qualified Data.List as L

foo = [1..5] L.\\ [1..3] -- evaluates to [4,5]
diff = (L.\\)

正如你在上面看到的,L.\\是一个合格的中缀运算符;它仍然可以用作中缀运算符。要将其用作值,您需要在整个内容周围加上括号。

于 2009-04-12T03:43:46.787 回答
5

请记住,我们导入符号包装的括号。例如

import T ((<*>))

所以导入合格是一样的:

import qualified T as Q

main = print (Q.<*>)
于 2009-04-12T06:21:56.077 回答