2014-12-05 17 views
6

Ad esempio con gli elenchi, se si scrive una regola con LHS di myFn [x], sarà possibile attivare anche quando il programmatore scrive myFn (x:[])? o dovrò scrivere una regola separata per ogni possibile sintassi?Le regole di riscrittura GHC sanno riconoscere lo zucchero sintattico?

+0

Sappiamo tutti che la costruzione di liste come '[a, b, c]' è solo zucchero per 'a: b: c: []', quindi queste due espressioni sono equivalenti, ma la seconda è la forma migliore per il modello corrispondenza. – AJFarmar

+1

Lo zucchero sintattico non ha importanza per le regole di riscrittura. – augustss

risposta

7

Le regole di riscrittura vengono ridotte di zucchero. Quindi una regola di riscrittura come

{-# RULES 
    "myFn/singleton" forall x. myFn [x] = myOtherFn x 
#-} 

verrà memorizzato internamente come

forall x. myFn (x:[]) = myOtherFn x 

E 'poi applicato alla forma de-zuccherata del programma. (Tutte le ottimizzazioni in GHC si verificano nella forma desertificata del programma).

4

La mia comprensione è che le cose puramente sintattiche come questa non contano; la regola sparerà in entrambi i modi.

Quello che sarà trova ad essere un problema è che myFn potrebbe essere stato inline per il momento GHC tenta di utilizzare la regola (in modo non ci sarà niente da fare a fuoco su). In generale, capire esattamente quando abilitare le tue regole è la parte difficile!

Problemi correlati