2009-04-12 5 views
15

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

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?

ответ

15

попробовать

three = (T.<*>) 

Это странно определить оператор инфиксную как целое. Рассмотрим \\ (установленное разностный оператор):

import qualified Data.List as L 

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

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

+0

Weird на самом деле, но я пытался сделать пример как можно более простым. –

5

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

import T ((<*>)) 

так импортирования квалифицирован тот же:

import qualified T as Q 

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

Это странное объяснение ... первая строка не имеет отношения к остальным. Несомненно, первая строка должна быть «Помните, что не все применяемые операторы должны быть заключены в скобки». И тогда есть 'f = (<*>)' против 'f = (M. <*>)'. – porges

Смежные вопросы