foldr
определяется так, что
foldr cons z (x:xs) = cons x (foldr cons z xs)
, поэтому, если cons
не использует второй аргумент, его значение не требуется.Поскольку Haskell является вызовом по необходимости, ненужные значения не оцениваются.
Так что нет, обе формулировки имеют одинаковые характеристики лени.
findKey key (x:xs)
= foldr (\(k,v) r -> if key == k then Just v else r) Nothing (x:xs)
= (\(k,v) r -> if key == k then Just v else r) x
(foldr (\(k,v) r -> if key == k then Just v else r) Nothing xs)
= case x of (k,v) -> if key == k then Just v else
(foldr (\(k,v) r -> if key == k then Just v else r) Nothing xs)
и поэтому, если удерживается key == k
, рекурсивный вызов (для определения значения r
) не запускается.