Почему начальное значение функции сокращения не является обязательным?

В haskell начальное значение для оператора foldl явно обязательное

 Prelude> foldl (+) 0 [1] 1 Prelude> foldl (+) 0 [] 0 Prelude> :t foldl (a -> b -> a) -> a -> [b] -> a 

Но в функции уменьшения (или functools.reduce ) начальное значение является необязательным

 reduce(function, sequence[, initial]) -> value 

Единственный раз, когда требуется начальное значение, – это когда последовательность пуста. Это согласуется с поведением в haskell. reduce ли в python, что если последовательность имеет размер 1; то он обрабатывает эти угловые случаи внутри?

 >> reduce(operator.sub, [1]) 1 >> reduce(operator.mul, [1]) 1 >> reduce(operator.add, [1]) 1 

Из руководства :

Если инициализатор не задан, и итерабельность содержит только один элемент, возвращается первый элемент


Я также хочу прокомментировать это:

Единственный раз, когда требуется начальное значение, когда последовательность пуста

Это не совсем правда. В операции сгиба обычно вы всегда предполагаете, что у вас есть более ранний результат для работы. Если ваша операция сложения является добавлением элементов в список, исходный элемент может быть пустым списком, поэтому вы можете добавить к нему элементы. В более общем случае начальное значение всегда необходимо, когда тип возврата функции отличается от типа элементов в списке.

Напомним, что в Haskell есть две версии сгибов – одна, которая берет семя некоторого типа результата, и тот, который предполагает, что семя является первым элементом последовательности.

 foldr :: (a -> b -> b) -> b -> [a] -> b foldr kz = go where go [] = z go (y:ys) = y `k` go ys 

а также

 foldr1 :: (a -> a -> a) -> [a] -> a foldr1 _ [x] = x foldr1 f (x:xs) = fx (foldr1 f xs) foldr1 _ [] = errorEmptyList "foldr1" 

foldr использует начальный элемент последовательности в качестве первого состояния.

Существует еще одно важное отличие: при использовании первого элемента последовательности в качестве входного состояния foldr1 ограничивается возвратом массива того же типа, что и входной список. foldr однако может возвращать некоторый другой тип.

Interesting Posts