Pergunta

Eu tenho um conflito de nomes entre dois módulos Haskell diferentes que querem usar o mesmo operador infix (<*>). O relatório Haskell 98 diz que

modid.varsym

é permitido, mas não posso fazê-lo funcionar. Em sua totalidade, aqui estão Test.hs:

module Test
where

import qualified Test2 as T

three = T.<*>

e Test2.hs:

module Test2
where
(<*>) = 3

Mas tentar compilar os resultados em uma mensagem de erro:

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

Eu tentei T.(<*>) mas isso não quer trabalhar.

Como posso referir a um nome simbólico definido em um módulo importado por import qualified?

Foi útil?

Solução

try

three = (T.<*>)

É estranho para definir um operador infix como um inteiro. Vamos considerar \\ (o operador diferença do conjunto):

import qualified Data.List as L

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

Como você pode ver acima, L.\\ é um operador infix qualificado; e ainda funciona como um operador infix. Para usá-lo como um valor, você colocar parênteses em torno da coisa toda.

Outras dicas

Lembre-se que nós importamos símbolos parens embrulhadas. Por exemplo.

import T ((<*>))

para importar qualificado é o mesmo:

import qualified T as Q

main = print (Q.<*>)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top