Каковы преимущества производительности использования ~ (ленивое совпадение шаблонов) в разделе Data.List. Продуманные примеры ленивого сопоставления образцов предполагают, что это полезно, когда значения внутри конструктора кортежа никогда не используются (f (x, y) = 1). В разделе (выберите, ниже) всегда используются списки ts, fs (если предикат p, примененный к x, является True или нет). Я уверен, что это очень хорошо информированное решение использовать ~, но в чем смысл? Почему не строгое соответствие шаблонов?
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)
(Примечание: я уже смотрел здесь! он не отвечает на вышеуказанный вопрос)