2009-04-12 11 views
15

Ich habe einen Namenskonflikt zwischen zwei verschiedenen Haskell-Modulen, die denselben Infix-Operator verwenden möchten (<*>). Der Haskell 98 Bericht sagt, dassWie schreibe ich den qualifizierten Namen eines Symbols in Haskell?

zulässig ist, aber ich kann es nicht zum Laufen bringen. In ihrer Gesamtheit hier sind Test.hs:

module Test 
where 

import qualified Test2 as T 

three = T.<*> 

und Test2.hs:

module Test2 
where 
(<*>) = 3 

Doch der Versuch führt zu einer Fehlermeldung zu kompilieren:

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

ich T.(<*>) versucht, aber das nicht funktioniert entweder.

Wie kann ich auf einen symbolischen Namen verweisen, der in einem von import qualified importierten Modul definiert ist?

Antwort

15

versuchen

three = (T.<*>) 

Es ist komisch, ein Infixoperator als eine ganze Zahl zu definieren. Betrachten wir \\ (die eingestellte Differenzoperator):

import qualified Data.List as L 

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

Wie Sie oben sehen können, ist L.\\ ein qualifizierter Infixoperator; und es funktioniert immer noch als Infix-Operator. Um es als Wert zu verwenden, setzen Sie Klammern um die ganze Sache.

+0

Sonderbare in der Tat, aber ich habe versucht, das Beispiel so einfach wie möglich zu machen. –

5

Denken Sie daran, dass wir Symbole eingepackte Parens importieren. Z.B.

import T ((<*>)) 

so qualifizierten Import ist das gleiche:

import qualified T as Q 

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

Das ist eine seltsame Erklärung ... die erste Zeile ist für den Rest nicht wirklich relevant. Sicherlich sollte die erste Zeile lauten: "Denken Sie daran, dass nicht vollständig angewendete Operatoren in Klammern gesetzt werden müssen." Und dann habe 'f = (<*>)' vs. 'f = (M. <*>)'. – porges