Como faço para escrever o nome qualificado de um símbolo em Haskell?
-
09-09-2019 - |
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
?
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.<*>)