2016-09-06 4 views
7

В названии говорится все. foldl1 и foldl' оба обобщены на Foldable, а foldl1' - нет. Это просто недавний контроль? Или это выбор дизайна?Почему foldl1 'не обобщен для Foldable?

Тип foldl1' является

foldl1' :: (a -> a -> a) -> [a] -> a 

Я ожидал, что он имеет тот же тип, foldl1:

foldl1 :: Foldable t => (a -> a -> a) -> t a -> a 

Я также вижу, что foldl1' экспортируется Data.List, но не Data.Foldable. Возможно, это связано?

+3

Ни 'foldl1', ни' foldl1'' принадлежит к 'Foldable'. Они принадлежат к 'Foldable1', классу непустых складных контейнеров. Кто-то допустил ошибку и поставил 'foldl1' в' Foldable'. Я не думаю, что у кого-то есть сердце, чтобы усугубить эту ошибку. – dfeuer

+0

@dfeuer: было введение «Складного», которому не предшествовал длительный период обсуждения и опросов? Было ли это упущено или это какой-то компромисс? – ljedrz

+0

@ljedrz Я думаю, вы смешаете дискуссию об использовании 'Foldable' в Prelude с оригинальным дизайном (если есть)' Foldable'. – Cactus

ответ

0

Возможно, обобщенная форма всего would have no good place to live? Возможно, также были некоторые из соображений производительности, но я не мог найти никакой информации об этом.

+0

Data.List уже экспортирует обобщенную форму foldl1 и foldl ', оба из которых являются частью экземпляра Foldable. Таким образом, похоже, что обобщенный foldl1 'должен быть экспортирован из Data.List и Data.Foldable для обеспечения согласованности. – Kevin