Предположим, я хочу сложить все элементы списка до первого отрицательного числа, но не включая его, и вернуть число и остальную часть списка. Простой способ сделать это
addPos l = s `seq` (s,back) where (front, back) = span (>= 0) l s = sum front
где seq
должен гарантировать, что никто случайно не создаст огромный преобразователь, заставив вернуться перед суммой.
Однако мне любопытно, достаточно ли умен GHC, чтобы избежать создания промежуточного переднего списка. Кроме того, может ли кто-нибудь объяснить, как (если вообще) выясняется, что он может накапливаться строго в сумме? В определении Prelude используется foldl, а не foldl', и определение GHC выглядит эквивалентно.