2009-04-12 18 views
15

Ho uno scontro di nomi tra due diversi moduli Haskell che vogliono utilizzare lo stesso operatore di infisso (<*>). Il rapporto Haskell 98 dice cheCome scrivere il nome qualificato di un simbolo in Haskell?

modid.varsym 

è consentito, ma non riesco a farlo funzionare. Nella loro interezza qui sono Test.hs:

module Test 
where 

import qualified Test2 as T 

three = T.<*> 

e Test2.hs:

module Test2 
where 
(<*>) = 3 

Ma cercando di compilare i risultati in un messaggio di errore:

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

ho provato T.(<*>) ma che non funziona o.

Come posso fare riferimento a un nome simbolico definito in un modulo importato da import qualified?

risposta

15

provare

three = (T.<*>) 

E 'strano per definire un operatore infisso come un intero. Consideriamo \\ (l'operatore differenza set):

import qualified Data.List as L 

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

Come potete vedere sopra, L.\\ è un operatore infisso qualificato; e funziona ancora come operatore infisso. Per usarlo come valore, metti le parentesi su tutta la faccenda.

+0

Strano davvero, ma stavo cercando di fare l'esempio più semplice possibile. –

5

Ricorda che importiamo i simboli avvolti in parens. Per esempio.

import T ((<*>)) 

quindi importare qualificato è la stessa:

import qualified T as Q 

main = print (Q.<*>) 
+0

Questa è una strana spiegazione ... la prima riga non è davvero rilevante per il resto. Sicuramente la prima riga dovrebbe essere "Ricorda che gli operatori non completamente applicati devono essere tra parentesi". E quindi avere 'f = (<*>)' vs. 'f = (M. <*>)'. – porges

Problemi correlati