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?
6
A
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!
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
Lo zucchero sintattico non ha importanza per le regole di riscrittura. – augustss