I've got a name clash between two different Haskell modules that want to use the same infix operator (<*>
). The Haskell 98 report says that
modid.varsym
is permitted, but I can't get it to work. In their entirety here are Test.hs
:
module Test
where
import qualified Test2 as T
three = T.<*>
and Test2.hs
:
module Test2
where
(<*>) = 3
But trying to compile results in an error message:
Test.hs:6:12: parse error on input `T.<*>'
I tried T.(<*>)
but that doesn't work either.
How can I refer to a symbolic name defined in a module imported by import qualified
?
The keyword qualified means that symbols in the imported modules are not imported into the unqualified (prefixless) namespace.
(->) is often called the "function arrow" or "function type constructor", and while it does have some special syntax, there's not that much special about it. It's essentially an infix type operator. Give it two types, and it gives you the type of functions between those types.
Haskell provides special syntax to support infix notation. An operator is a function that can be applied using infix syntax (Section 3.4), or partially applied using a section (Section 3.5).
In Haskell, the colon operator is used to create lists (we'll talk more about this soon). This right-hand side says that the value of makeList is the element 1 stuck on to the beginning of the value of makeList .
try
three = (T.<*>)
It's weird to define an infix operator as an integer. Let's consider \\
(the set difference operator):
import qualified Data.List as L
foo = [1..5] L.\\ [1..3] -- evaluates to [4,5]
diff = (L.\\)
As you can see above, L.\\
is a qualified infix operator; and it still works as an infix operator. To use it as a value, you put parentheses around the whole thing.
Remember that we import symbols wrapped parens. E.g.
import T ((<*>))
so importing qualified is the same:
import qualified T as Q
main = print (Q.<*>)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With