21

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?

Don Stewart
  • 137,316
  • 36
  • 365
  • 468
Norman Ramsey
  • 198,648
  • 61
  • 360
  • 533

2 Answers2

20

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.

newacct
  • 119,665
  • 29
  • 163
  • 224
6

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.<*>)
Don Stewart
  • 137,316
  • 36
  • 365
  • 468
  • This is a strange explanation... the first line isn't really relevant to the rest. Surely the first line should be "Remember that not-fully applied operators need to be parenthesized." And then have 'f = (<*>)' vs. 'f = (M.<*>)'. – porges Apr 15 '09 at 10:25