2009-04-12 25 views
15

我想要使用相同的中缀操作符(<*>)的两个不同的Haskell模块之间的名称冲突。 Haskell 98报告称,如何在Haskell中编写符号的限定名称?

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导入的模块中定义的符号名称?

回答

15

尝试

three = (T.<*>) 

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

import qualified Data.List as L 

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

正如你可以在上面看到,L.\\是一个合格的中缀操作;它仍然是一个中缀运算符。为了将它用作价值,你在整个事物上放置了括号。

+0

确实怪异,但我试图让这个例子尽可能简单。 – 2009-04-12 04:15:08

5

请记住,我们导入符号包裹parens。例如。

import T ((<*>)) 

所以进口资格是相同的:

import qualified T as Q 

main = print (Q.<*>) 
+0

这是一个奇怪的解释......第一行与其余行不相关。第一行应该是“记住未完全应用的操作员需要加括号”。然后有'f =(<*>)'与'f =(M. <*>)'。 – porges 2009-04-15 10:25:01