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?

¿Fue útil?

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.<*>)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top