Как написать квалифицированное имя символа в Haskell?

У меня есть столкновение имен между двумя разными модулями Haskell, которые хотят использовать один и тот же инфиксный оператор (<*>). В докладе Haskell 98 говорится, что

modid.varsym

разрешено, но я не могу заставить его работать. В целом здесь Test.hs:

module Test
where

import qualified Test2 as T

three = T.<*>

и Test2.hs:

module Test2
where
(<*>) = 3

Но попытка скомпилировать результаты в сообщении об ошибке:

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

Я пробовал T.(<*>), но это тоже не работает.

Как я могу ссылаться на символическое имя, определенное в модуле, импортированном с помощью import qualified?

Ответы

Ответ 1

попробовать

three = (T.<*>)

Странно определять оператор инфикса как целое. Пусть рассмотрим \\ (заданный разностный оператор):

import qualified Data.List as L

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

Как вы можете видеть выше, L.\\ - это квалифицированный инфиксный оператор; и он по-прежнему работает как инфиксный оператор. Чтобы использовать его в качестве значения, вы помещаете круглые скобки вокруг всего.

Ответ 2

Помните, что мы импортируем символы, завернутые в parens. Например.

import T ((<*>))

так что импортирование должно быть одинаковым:

import qualified T as Q

main = print (Q.<*>)