Frage

Ich habe einen Namen Zusammenstoß zwischen zwei verschiedenen Haskell Module bekam, die denselben Infixoperator (<*>) verwenden möchten. Der Haskell 98 Bericht sagt, dass

modid.varsym

ist erlaubt, aber ich kann es nicht zu arbeiten. 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 habe versucht, T.(<*>) aber das funktioniert auch nicht.

Wie kann ich zu einem symbolischen Namen beziehen sich in einem Modul von import qualified importiert definiert?

War es hilfreich?

Lösung

Versuch

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 Infixoperator. Um es als Wert zu verwenden, setzen Sie Klammern um die ganze Sache.

Andere Tipps

Beachten Sie, dass wir importieren Symbole eingewickelt Pars. Z.

import T ((<*>))

so Import qualifiziert ist gleich:

import qualified T as Q

main = print (Q.<*>)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top