Определения по умолчанию для foldl 'и foldr' кажутся странными - PullRequest
0 голосов
/ 09 мая 2018

Определения по умолчанию foldl' и foldr' кажутся странными. У них есть определение по умолчанию как:

class Foldable t where
    -- ...
    foldr' f z0 xs = foldl f' id xs z0
      where f' k x z = k $! f x z
    -- ...
    foldl' f z0 xs = foldr f' id xs z0
      where f' x k z = k $! f z x
    -- ...

Почему бы и нет ?:

class Foldable t where
    -- ...
    foldr' f = foldr (\x z -> f x $! z)
    -- ...
    foldl' f = foldl (\z x -> flip f x $! z)
    -- ...

1 Ответ

0 голосов
/ 09 мая 2018

Вообще говоря, foldl' лучше всего подходит для вещей, которые похожи на cons-списки, а foldr' лучше всего подходит для вещей, которые похожи на snoc-списки.Ситуации симметричны, поэтому давайте просто посмотрим на списки минусов, где foldl' лучше бы было хорошо.

Вы, наверное, читали, что foldl для списков минусов может привести к пробелам, если это не такоптимизирован достаточно хорошо.Ну, это именно то, что здесь произойдет.f' строгое, но ни один из его результатов не требуется до тех пор, пока сгиб не достигнет конца списка!

Определения по умолчанию дают небольшой поворот, что позволяет правильно работать даже наивной компиляции (или интерпретации).

...