Как написать квалифицированное имя символа в 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.<*>)