Как написать полное имя символа в 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?


person Norman Ramsey    schedule 12.04.2009    source источник


Ответы (2)


пытаться

three = (T.<*>)

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

import qualified Data.List as L

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

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

person newacct    schedule 12.04.2009
comment
Действительно странно, но я пытался сделать пример максимально простым. - person Norman Ramsey; 12.04.2009

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

import T ((<*>))

поэтому импорт квалифицированных аналогичен:

import qualified T as Q

main = print (Q.<*>)
person Don Stewart    schedule 12.04.2009
comment
Странное объяснение... первая строка не имеет отношения к остальным. Конечно, первая строка должна быть «Помните, что неполностью применяемые операторы должны быть заключены в скобки». А затем имеем «f = (‹*›)» против «f = (M.‹*›)». - person porges; 15.04.2009