2013-07-19 14 views
6

Mi piace giocare in REPL perché è un modo davvero semplice e veloce di provare nuove cose. Alcuni aspetti della lingua sono, come sapete, fatti diversamente nel REPL rispetto ai moduli interni, mentre le definizioni a più righe sono una di queste.È possibile definire la dichiarazione di fissità nel REPL?

Ora, mi chiedo se, e in tal caso come, posso dichiarare la fissità dell'operatore nella REPL. L'ingenuo tentativo ... sorpresa ... non funziona.

Prelude> let (f · g) x = f(g(x)) 
Prelude> infixl 7 · 
+2

Per gli elementi definiti al prompt, lasciare infixl 7/& /; f/&/g = \ x -> f (g x) '. Non puoi avere dichiarazioni di fissità per cose definite altrove, afaik. –

risposta

9

È possibile dichiarare fissità utilizzando le definizioni multilinea come questo

>>> :{ 
>>> let infixl 7 *** 
>>>  (f *** g) (a,b) = (f a, g b) 
>>> :} 
>>> (negate *** show) (1,2) 
(-1,"2") 

Edit: Anche se, curiosamente, non viene visualizzata la fissità quando si chiede GHCI sulla funzione

>>> :i *** 
(***) :: (a -> a') -> (b -> b') -> (a, b) -> (a', b') 
     -- Defined at <interactive>:10:8 

rispetto a

>>> :i && 
(&&) :: Bool -> Bool -> Bool  -- Defined in `GHC.Classes' 
infixr 3 && 
+0

Viene visualizzato da my ghci, sotto la riga '- Defined at'. –

+1

Infatti la fissità viene visualizzata da ghci-7.6, ma non da ghci-7.4. – leftaroundabout

+0

Questo non sembra funzionare per gli operatori di tipo nelle famiglie di tipi. – CMCDragonkai

Problemi correlati