Juan-Carlos Gandhi (
juan_gandhi) wrote2010-01-29 08:30 pm
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
how to say in Haskell...
pairwise :: [a] → [(a, a)]
pairwise [] = []
pairwise (x:y:rest) = (x,y) : pairwise rest
is there something that does it already? Could not figure out.
pairwise :: [a] → [(a, a)]
pairwise [] = []
pairwise (x:y:rest) = (x,y) : pairwise rest
no subject
no subject
Точно так же foldr может спокойно сворачивать бесконечные списки ничего не переполняя.
no subject
*Main> foldr (+) 0 [1..]
*** Exception: stack overflow
*Main> sum [1..]
(комп намертво зависает, считая расходящуюся сумму, но переполнения не происходит)
foldr может сворачивать бесконечные списки только при наличии определенных оптимизаций, а в интерактивном режиме они отключены. sum же скомпилирована уже с оптимизациями и поэтому ничего не переполняет.
no subject
Посмотрите на определение foldr, нет там никакой рекурсии. А (+) точно так же и foldl оверфловнет -- потому что он на самом деле ничего не вычисляет, а строит огромное дерево термов, при попытке которого и случается SO.
no subject
no subject
no subject
foldr f x0 x:xs = f x (foldr f x0 xs)
foldr f x0 [] = x0
no subject