2014-12-05 10 views
6

Zum Beispiel mit Listen, wenn ich eine Regel mit der LHS von myFn [x] schreibe, wird es auch in der Lage sein zu feuern, wenn der Programmierer schreibt myFn (x:[])? Oder muss ich eine separate Regel für jede mögliche Syntax schreiben?Wissen die GHC-Umschreibungsregeln syntaktischen Zucker?

+0

Wir alle wissen, dass die Listenkonstruktion wie '[a, b, c]' nur Zucker für 'a: b: c: []' ist, also sind diese beiden Ausdrücke äquivalent, aber die zweite Form ist besser für Muster passend. – AJFarmar

+1

Syntactic Zucker spielt keine Rolle für Rewrite-Regeln. – augustss

Antwort

7

Re-Write-Regeln werden entzuckert. So eine erneute Schreibregel wie

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

wird intern als

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

gespeichert werden Es wird dann auf die de-gezuckerte Form des Programms angewendet. (Alle Optimierung in GHC erfolgt auf der entzuckerten Form des Programms).

4

Mein Verständnis ist, dass rein syntaktische Dinge wie diese keine Rolle spielen; Die Regel wird in beide Richtungen ausgelöst.

Was Sie wird finden ein Problem zu sein, ist, dass myFn könnte durch die Zeit inlined wurden GHC versucht, die Regel zu verwenden (so wird es nichts für sie sein Feuer auf). Im Allgemeinen ist es schwierig, genau herauszufinden, wann man seine Regel (en) aktivieren soll!

Verwandte Themen