2009-04-12 27 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