Jakie są zalety wydajności związane z użyciem ~ (leniwego dopasowywania wzorca) w partycji Data.List. Wymyślone przykłady leniwego dopasowania wzorców sugerują, że jest to przydatne, gdy wartości wewnątrz konstruktora krotek nie są nigdy używane (f (x, y) = 1). W partycji (wybierz, poniżej), listy ts, fs są zawsze używane (jeśli predykat p zastosowany do x jest prawdziwy, czy nie). Jestem pewien, że jest to bardzo dobrze poinformowana decyzja, aby użyć ~, ale o co chodzi? Dlaczego nie ścisłe dopasowywanie wzorców?Leniwe dopasowywanie wzorca w Data.List
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)
(Uwaga: Ja już wyglądał here to nie jest odpowiedź na powyższe pytanie!)
cf. http://en.wikipedia.org/wiki/Tail_call#Tail_recursion_modulo_cons –