Как мне написать квалифицированное имя символа в Haskell? - PullRequest
19 голосов
/ 12 апреля 2009

У меня есть конфликт имен между двумя разными модулями 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?

Ответы [ 2 ]

18 голосов
/ 12 апреля 2009

1001 * попробовать *

three = (T.<*>)

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

import qualified Data.List as L

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

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

5 голосов
/ 12 апреля 2009

Помните, что мы импортируем символы в скобках. Э.Г.

import T ((<*>))

так что импорт квалифицированных одинаков:

import qualified T as Q

main = print (Q.<*>)
...