how to say in Haskell...
Jan. 29th, 2010 08:30 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
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
Date: 2010-01-30 06:25 am (UTC)no subject
Date: 2010-01-30 06:42 am (UTC)no subject
Date: 2010-01-30 12:19 pm (UTC)pairwise (x:[]) = [(x,x)] или []
Без подобного паттерн получается неполным.
no subject
Date: 2010-01-30 07:23 am (UTC)no subject
Date: 2010-01-30 09:58 am (UTC)no subject
Date: 2010-01-30 10:03 am (UTC)no subject
Date: 2010-01-30 10:47 am (UTC)Точно так же foldr может спокойно сворачивать бесконечные списки ничего не переполняя.
no subject
Date: 2010-01-30 12:38 pm (UTC)*Main> foldr (+) 0 [1..]
*** Exception: stack overflow
*Main> sum [1..]
(комп намертво зависает, считая расходящуюся сумму, но переполнения не происходит)
foldr может сворачивать бесконечные списки только при наличии определенных оптимизаций, а в интерактивном режиме они отключены. sum же скомпилирована уже с оптимизациями и поэтому ничего не переполняет.
no subject
Date: 2010-01-30 12:55 pm (UTC)Посмотрите на определение foldr, нет там никакой рекурсии. А (+) точно так же и foldl оверфловнет -- потому что он на самом деле ничего не вычисляет, а строит огромное дерево термов, при попытке которого и случается SO.
no subject
Date: 2010-01-30 12:56 pm (UTC)no subject
Date: 2010-01-30 01:37 pm (UTC)no subject
Date: 2010-01-30 01:44 pm (UTC)foldr f x0 x:xs = f x (foldr f x0 xs)
foldr f x0 [] = x0
no subject
Date: 2010-01-30 04:27 pm (UTC)no subject
Date: 2010-01-30 03:37 pm (UTC)no subject
Date: 2010-01-30 12:20 pm (UTC)А какая разница, если это пишется за полминуты?
no subject
Date: 2010-01-30 02:06 pm (UTC)pairwise (x:y:rest) = (x,y) : pairwise rest
pairwise _ = []
no subject
Date: 2010-01-30 02:46 pm (UTC)и как-нибудь взять все элементы с позиций 0,2..
no subject
Date: 2010-01-30 02:53 pm (UTC)takeNth _ [] = []
takeNth n lst = (head lst) : takeNth (drop n lst)
pairwise lst = takeNth 1 $ zip lst (tail lst)
no subject
Date: 2010-01-30 02:54 pm (UTC)pairwise lst = takeNth 2 $ zip lst (tail lst)
no subject
Date: 2010-01-30 03:34 pm (UTC)no subject
Date: 2010-01-30 03:36 pm (UTC)Это самое takeNth может ещё где-то потребоваться.
no subject
Date: 2010-01-30 06:27 pm (UTC)На той же идее
takeNth n lst = map fst $ filter (\(x,t)-> t == 1) $ zip lst $ cycle [1..n]
Но по-моему, это уже извраты,
которые непонятно, для чего нужны,
кроме как, сэкономить лишнюю строчку.
Лучше писать тупо и понятно,
потом свой же код проще смотреть.
полет фантазии
Date: 2010-01-30 04:15 pm (UTC)хотел без рекурсии и не определяя никаких вспомогательных ф-й, но не вышло
Re: полет фантазии
Date: 2010-01-30 04:21 pm (UTC)pairwise xs = map snd $ filter fst $ zip (cycle [True, False]) $ zip xs (tail xs)
Re: полет фантазии
Date: 2010-01-30 06:06 pm (UTC)Re: полет фантазии
Date: 2010-01-30 06:17 pm (UTC)no subject
Date: 2010-01-31 10:33 pm (UTC)splitInto n = unfoldr (chunk n)
where chunk _ [] = Nothing
chunk n lst = Just $ splitAt n lst
no subject
Date: 2010-02-01 12:12 am (UTC)