У меня есть вопрос относительно определения строгих vs нестрогих. В вики-книге Haskell для Laziness (http://en.wikibooks.org/wiki/Haskell/Laziness) в разделе "Анализ строгости черного ящика" делается следующее утверждение:
[Предполагая функцию f, которая принимает один параметр.] Функция f является строгой функцией, если и только если f undefined приводит к печатанию ошибки и остановке нашей программы.
Вики контрастируют const
с id
, показывая нестрогую и строгую функцию соответственно.
Мой вопрос заключается в том, что у меня сложилось впечатление, что складчатый элемент оценивался нестрогим образом, вызывая нежелательные утечки пространства, в то время как foldl 'был строгим.
Однако вышеприведенный тест, похоже, утверждает, что и foldl, и foldl 'строги. То есть обе функции производят undefined, если любой из их параметров undefined:
> Data.List.foldl (+) undefined [1,2,3,4]
Prelude.undefined
> Data.List.foldl' (+) 0 undefined
Prelude.undefined
> Data.List.foldl' (+) undefined [1,2,3,4]
Prelude.undefined
> Data.List.foldl (+) 0 undefined
Prelude.undefined
Может кто-нибудь объяснить, что мне не хватает?
Спасибо!