¿Cuáles son los beneficios de rendimiento de usar ~ (coincidencia de patrón diferido) en la partición de Data.List? Los ejemplos de adaptación de patrones perezosos sugieren que es útil cuando los valores dentro del constructor de tuplas nunca se usan (f (x, y) = 1). En la partición (seleccionar, abajo), las listas ts, fs siempre se usan (si el predicado p aplicado a x es verdadero o no). Estoy seguro de que esta es una decisión muy bien informada para usar ~, pero ¿cuál es el punto? ¿Por qué no emparejar patrones estrictos?Coincidencia de patrón diferido en 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)
(Nota: Ya he mirado here que no responde a la pregunta anterior!)
cf. http://en.wikipedia.org/wiki/Tail_call#Tail_recursion_modulo_cons –