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
no subject
pairwise (x:[]) = [(x,x)] или []
Без подобного паттерн получается неполным.
no subject
no subject
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
no subject
no subject
А какая разница, если это пишется за полминуты?
no subject
pairwise (x:y:rest) = (x,y) : pairwise rest
pairwise _ = []
no subject
и как-нибудь взять все элементы с позиций 0,2..
no subject
takeNth _ [] = []
takeNth n lst = (head lst) : takeNth (drop n lst)
pairwise lst = takeNth 1 $ zip lst (tail lst)
no subject
pairwise lst = takeNth 2 $ zip lst (tail lst)
no subject
no subject
Это самое takeNth может ещё где-то потребоваться.
no subject
На той же идее
takeNth n lst = map fst $ filter (\(x,t)-> t == 1) $ zip lst $ cycle [1..n]
Но по-моему, это уже извраты,
которые непонятно, для чего нужны,
кроме как, сэкономить лишнюю строчку.
Лучше писать тупо и понятно,
потом свой же код проще смотреть.
полет фантазии
хотел без рекурсии и не определяя никаких вспомогательных ф-й, но не вышло
Re: полет фантазии
pairwise xs = map snd $ filter fst $ zip (cycle [True, False]) $ zip xs (tail xs)
Re: полет фантазии
Re: полет фантазии
no subject
splitInto n = unfoldr (chunk n)
where chunk _ [] = Nothing
chunk n lst = Just $ splitAt n lst
no subject