2013-04-24 4 views
6

Quando si lavora con gli angoli in gradi, voglio definire il simbolo dei gradi (°) da utilizzare come operatore postfisso. Attualmente, io uso questa linea (in GHCi):Come definire un operatore postfisso in Haskell?

let o = pi/180 

e usarlo in questo modo:

tan(11*o) 

ma voglio solo andare:

tan 11° 

che è molto più chiara. L'operatore di laurea dovrebbe avere una precedenza più alta di "tan" e altre funzioni.

Il più vicino che ho è:

let (°) x _ = x*pi/180 

usato in questo modo:

tan(11°0) 

ma la precedenza di default significa che le parentesi sono ancora necessari, e con il numero fittizio, questa alternativa è peggio di quello che attualmente uso.

+8

"L'operatore di laurea dovrebbe avere precedenza più alta di" tan "e altre funzioni." <- Non funzionerà, l'applicazione della funzione ha la precedenza più alta secondo le specifiche del linguaggio. –

+0

Perché non si definisce semplicemente un nuovo tipo numerico (avvolgimento di Double o qualsiasi altra cosa) con un newtype che rappresenta i gradi? Ovviamente dovrai prestare attenzione alla natura "modulare" dei gradi se vuoi definire l'uguaglianza, ecc. –

+0

Haskell non è il tipo di linguaggio in cui puoi fare solo qualsiasi cosa compili il modo in cui sei abituato a scrivere esso. A differenza di Perl o anche di Python, la sintassi infisso di Haskell è in realtà molto semplice e semplice, è così ben progettata che anche questa semplice base consente un sacco sorprendente di abbreviazioni molto efficienti, di lasciare fuori molti parens, e in generale per rendere le cose abbastanza leggibili Ma quest'ultimo punto è in parte perché ci sono queste regole di parsing piuttosto rigide. – leftaroundabout

risposta

3

Verificare fixity declarations, che consente di modificare la precedenza degli operatori di infisso. Fai attenzione a non impostare la precedenza troppo alta, altrimenti gli altri operatori non si comportano come previsto.

Ad esempio:

infixl 7 ° 
(°) x _ = x*pi/180 

Edit: ah, ha ragione @ Daniel Fischer - questo non funzionerà per le vostre esigenze attuali perché l'applicazione funzione ha la più alta precedenza

11

Non è possibile, almeno in Haskell come definito dal Rapporto. C'è, tuttavia, a GHC extension that allows postfix operators.

Purtroppo questo non ti dà tutto quello che vuoi; in particolare, richiede ancora parentesi, come spesso fa l'operatore di negazione unario.