私は関数(*~)
を持っています。 x *~ y
を評価するコストの大部分は、おおよそこれらの線に沿って第2引数を、検査から来ている:右手演算子セクションの部分評価
(*~) :: 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
は、部分的に(*~ y)
のようなオペレータのセクションを評価するためにGHCを説得するためにいくつかの方法はありますか?
私はそれが好きで書き換えてみました:
(*~) = flip go
where
go y = let y' = expensive y
in case y' of
Bar -> cheapFunction y'
Baz -> cheapFunction2 y'
Quux -> cheapFunction3 y'
が、助けていないようでした。
flip
は、反転する前にすべての議論が必要なので、これは考えられますか?
オペレータ自体を反転させるのが単なる方法ですが、既存の表記法と並んでいるため、高価なオペランドが右側にある場合は、はるかに自然に読み込みます。
正しく製作された{-# RULE #-}
はここで私を救うことができますか?もしそうなら、それは何を言いますか? (特に、ルールがマッチを探す前にセクション構文がどの程度離れているかは不明です)
私は部分評価があなたを買うだろうか分かりません。 「y」は既に共有されます。あなたはメモをしたいですか?自分でメモを追加する必要があります。どのようなルールを書いておきたいですか? –
カスタム「フリップ」を使用するとどうなりますか? 'flip 'f x = \ y - >インラインf y x' – dfeuer
@ReinHenrichsすでに' y'は共有されますか?もしそうなら、私の理解はかなり壊れており、私はどのように答えを受け入れるのが大好きです。 'fmap(*〜y)someLongList'を実行すると毎回再計算されません。 –