(*~)
işlevim var. x *~ y
değerlendiren maliyetinin çoğu kabaca bu satırlar boyunca, ikinci argüman teftiş geliyor: Kısmen (*~ y)
gibi operatör bölümlerini değerlendirmek için ghc ikna etmenin bir yoluKısmen sağ elle çalışan kullanıcı bölümlerini değerlendirmek
(*~) :: 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
var mı?
ben gibi yeniden denedi:(*~) = flip go
where
go y = let y' = expensive y
in case y' of
Bar -> cheapFunction y'
Baz -> cheapFunction2 y'
Quux -> cheapFunction3 y'
ama yardımcı görünmüyordu. Bunun nedeni, flip
'un saygısızlık yapmadan önce tüm argümanlarını gerektirmesi olabilir.
Tek yol, yalnızca operatörün kendisini çevirmek olabilir, ancak pahalı işlenen sağ tarafta olduğunda, daha çok doğal olarak okur, çünkü varolan bir gösterimle hizalanır.
Düzgün hazırlanmış bir {-# RULE #-}
beni buradan kurtarır mı? Eğer öyleyse, ne söylemeli? (Ben kurallar sözdizimi, diğer şeylerin yanı sıra, eşleşmeleri aramaya başlamadan önce ne kadar uzağa düşmüş olacağımı açıklığa kavuşamıyorum.)
Kısmi değerlendirmenin sizi satın alacağından emin değilim. zaten paylaşılacaksınız. Memoization istiyor musunuz? Notu kendiniz eklemeniz gerekecek. Ne tür bir kural yazmak istersin? –
Özel bir 'çevirme 'kullanırsanız ne olur? 'flip' f x = \ y -> satır içi f y x' – dfeuer
@ReinHenrichs '' 'zaten paylaşılacak mı? Eğer öyleyse benim anlayışım oldukça bozuk ve nasıl olduğunu açıklayan bir cevabı kabul etmeyi çok isterim. Eğer fmap (* ~ y) bazıLongList 'i yaparsam her seferinde yeniden hesaplanmayacak mı? –