Wie schreibe ich den qualifizierten Namen eines Symbols in Haskell?
-
09-09-2019 - |
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?
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.<*>)