2009-04-12 9 views
15

Tengo un choque de nombres entre dos módulos Haskell diferentes que quieren usar el mismo operador infijo (<*>). El informe Haskell 98 dice que¿Cómo escribo el nombre calificado de un símbolo en Haskell?

modid.varsym 

está permitido, pero no puedo hacerlo funcionar. En su totalidad aquí son Test.hs:

module Test 
where 

import qualified Test2 as T 

three = T.<*> 

y Test2.hs:

module Test2 
where 
(<*>) = 3 

Pero tratar de compilar los resultados en un mensaje de error:

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

Probé T.(<*>) pero eso no funciona ya sea.

¿Cómo puedo hacer referencia a un nombre simbólico definido en un módulo importado por import qualified?

Respuesta

15

tratar

three = (T.<*>) 

Es raro para definir un operador infijo como un entero. Vamos a considerar \\ (el operador de conjunto diferencia):

import qualified Data.List as L 

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

Como se puede ver arriba, L.\\ es un operador infijo cualificado; y todavía funciona como un operador infijo. Para usarlo como valor, pones paréntesis alrededor de todo.

+0

extraño en verdad, pero yo estaba tratando de hacer el ejemplo más simple posible. –

5

Recuerde que importamos símbolos envueltos parens. P.ej.

import T ((<*>)) 

por lo importar cualificado es el mismo:

import qualified T as Q 

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

Esta es una explicación extraña ... la primera línea no es realmente relevante para el resto. Seguramente, la primera línea debería ser "Recuerde que los operadores no totalmente aplicados deben estar entre paréntesis". Y luego tiene 'f = (<*>)' vs. 'f = (M. <*>)'. – porges

Cuestiones relacionadas