¿Cómo se escribe el nombre completo de un símbolo en Haskell?
-
09-09-2019 - |
Pregunta
Tengo un choque entre dos módulos nombre Haskell diferentes que desean utilizar el mismo operador infijo (<*>
). El informe dice que Haskell 98
modid.varsym
está permitido, pero no puedo conseguir que funcione. 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 tratar de compilar los resultados en un mensaje de error:
Test.hs:6:12: parse error on input `T.<*>'
He intentado T.(<*>)
pero que no funciona bien.
¿Cómo puedo referir a un nombre simbólico definido en un módulo importado por import qualified
?
Solución
try
three = (T.<*>)
Es raro para definir un operador infijo como un entero. Vamos a considerar \\
(el operador diferencia de conjuntos):
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 un valor, se pone paréntesis alrededor de todo el asunto.
Otros consejos
Recuerde que importan símbolos envueltos parens. Por ejemplo.
import T ((<*>))
así que la importación cualificado es el mismo:
import qualified T as Q
main = print (Q.<*>)