sirve - residuo en haskell
¿Cómo escribo el nombre calificado de un símbolo en Haskell? (2)
Tengo un conflicto de nombres entre dos módulos Haskell diferentes que quieren usar el mismo operador de infijo ( <*>
). El informe Haskell 98 dice que
modid.varsym
Está permitido, pero no puedo hacerlo funcionar. En su totalidad aquí están Test.hs
:
module Test
where
import qualified Test2 as T
three = T.<*>
y Test2.hs
:
module Test2
where
(<*>) = 3
Pero tratando de compilar los resultados en un mensaje de error:
Test.hs:6:12: parse error on input `T.<*>''
Intenté T.(<*>)
pero eso tampoco funciona.
¿Cómo puedo hacer referencia a un nombre simbólico definido en un módulo importado por import qualified
?
Recuerda que importamos simbolos envueltos en parens. P.ej
import T ((<*>))
por lo que la importación cualificada es la misma:
import qualified T as Q
main = print (Q.<*>)
tratar
three = (T.<*>)
Es extraño definir un operador infijo como un entero. Consideremos //
(el operador de diferencia de conjunto):
import qualified Data.List as L
foo = [1..5] L.// [1..3] -- evaluates to [4,5]
diff = (L.//)
Como puede ver arriba, L.//
es un operador de infijo calificado; y todavía funciona como un operador de infijo. Para usarlo como un valor, pones paréntesis alrededor de todo el asunto.