Ich habe eine Funktion (*~)
. Der größte Teil der Kosten für die x *~ y
Auswertung kommt aus dem zweiten Argument Inspektion, etwa entlang dieser Linien:Teilweise Auswertung rechtshändige Bedienerabschnitte
(*~) :: a -> b d -> c d a
x *~ y = case y' of
Bar -> cheapFunction y' x
Baz -> cheapFunction2 y' x
Quux -> cheapFunction3 y' x
where
y' = expensive y
Gibt es eine Möglichkeit GHC zu überzeugen, teilweise Operator Abschnitte wie (*~ y)
zu bewerten?
Ich habe versucht, es wie Umschreiben:
(*~) = flip go
where
go y = let y' = expensive y
in case y' of
Bar -> cheapFunction y'
Baz -> cheapFunction2 y'
Quux -> cheapFunction3 y'
aber es schien nicht zu helfen. Ich denke, dies könnte sein, weil flip
alle Argumente benötigt, bevor es das Spiegeln macht?
Ein Weg wäre nur, den Operator selbst umzudrehen, aber er liest viel natürlicher, wenn der teure Operand auf der rechten Seite steht, weil er mit einer existierenden Notation übereinstimmt.
Kann ein richtig gefertigter {-# RULE #-}
mich hier heraus retten? Wenn ja, was sollte es sagen? (Ich bin unklar, wie weit die Schnittsyntax entziffert wurde, bevor Regeln nach Übereinstimmungen suchen.)
Ich bin mir nicht sicher, welche Teilbewertung Sie kaufen würde. 'y'' wird bereits geteilt. Möchten Sie Memoization? Sie müssen Memoization selbst hinzufügen. Welche Art von Regel möchten Sie schreiben? –
Was passiert, wenn Sie einen benutzerdefinierten 'Flip' verwenden? 'flip 'f x = \ y -> inline f y x' – dfeuer
@ReinHenrichs Wird' y'' schon geteilt? Wenn ja, dann ist mein Verständnis ziemlich kaputt und ich würde gerne eine Antwort akzeptieren, die erklärt, wie. Wenn ich 'fmap (* ~ y) someLongList' mache, wird es nicht jedes Mal neu berechnet? –