2012-09-14 17 views
17

Data.List bölümünde ~ (tembel desen eşleşmesi) kullanmanın performans yararları nelerdir. Tembel desen eşleştirmesinin zoraki örnekleri, tuple yapıcısı içindeki değerlerin hiç kullanılmadığında yararlı olduğunu göstermektedir (f (x, y) = 1). Bölümde (aşağıda, aşağıda), ts, fs listelerinin her zaman kullanılır (x'ye uygulanan p değeri Doğruysa veya olmasın). Eminim bu çok iyi bilgilendirilmiş bir karardır ~, ama ne anlamı var? Neden sıkı eşleme uymuyorsunuz?Data.List içinde Tembel Kalıp eşleşmesiList

partition    :: (a -> Bool) -> [a] -> ([a],[a]) 
{-# INLINE partition #-} 
partition p xs = foldr (select p) ([],[]) xs 

select :: (a -> Bool) -> a -> ([a], [a]) -> ([a], [a]) 
select p x ~(ts,fs) | p x  = (x:ts,fs) 
        | otherwise = (ts, x:fs) 

(Not: Zaten here baktım yukarıdaki soruya cevap vermez!)

+0

cf. http://en.wikipedia.org/wiki/Tail_call#Tail_recursion_modulo_cons –

cevap

17

nokta zaman uç sıkı desen eşleştirme ile, sonucun montaj sadece başlayabileceğini olmasıdır Bölümlenmiş olan listeye erişildi, özellikle partition sonsuz listeler için hiç çalışmayacaktı.

Kesin bir desen eşleşmesiyle, argüman WHNF'ye değerlendirilmelidir. Bu, x'un ilk veya ikinci bileşene eklenip eklenmeyeceğine karar vermeden önce kuyruğun foldr tamamının bitmesi gerektiği anlamına gelir. yapay model eşlemede

select p x (foldr (select p) ([],[]) (y:z:ws)) 
~> select p x (select p y (select p z (foldr (select p) ([],[]) ws))) 

, bir çift uygun bileşen ilk bir unsur olarak x ile hemen imal edilir ve gerektiğinde iki liste geri kalanı daha sonra değerlendirilmek üzere.