данный
xs = [1,2,3,4,6,7,9,10,11]
Я хочу вернуться
<Код> [[1,2,3,4], [6,7], [9,10,11]]
Я думал, что смогу сделать:
groupBy (\x y -> succ x == y) xs
но это возвращает:
<Код> [[1,2], [3,4], [6,7], [9,10], [11]]
немного поиска вернули следующее из предложения Haskell Data.List страницы .
groupBy :: (a -> a -> Bool) -> [a] -> [[a]]
groupBy rel [] = []
groupBy rel (x:xs) = (x:ys) : groupBy rel zs
where (ys,zs) = groupByAux x xs
groupByAux x0 (x:xs) | rel x0 x = (x:ys, zs)
where (ys,zs) = groupByAux x xs
groupByAux y xs = ([], xs)
Один из примеров, которые они дают, - это то, что я ищу:
groupBy (\a b -> a+1 == b) [1,2,3,4,6]
[[1,2,3,4],[6]]
Итак, мой вопрос ... Есть ли другой подход к этому, в отличие от переопределения groupBy
, поскольку это кажется немного драматичным?
РЕДАКТИРОВАТЬ...
Я решил реализовать его следующим образом:
pattern :: (Enum a, Eq a) => (a -> a) -> [a] -> [[a]]
pattern f = foldr g []
where g a [] = [[a]]
g a xs | f a == head (head xs) = (a : head xs): tail xs
| otherwise = [a]:xs
что позволяет такие вещи:
*Main Map> pattern succ "thisabcdeisxyz"
["t","hi","s","abcde","i","s","xyz"]
*Main Map> pattern (+ 3) [3,6,9,12,1,2,3,2,5,8,23,24,25]
[[3,6,9,12],[1],[2],[3],[2,5,8],[23],[24],[25]]
или работать точно так же, как group
- не то, что есть причина:
*Main Map> let xs = [1,1,1,2,3,4,5,6,6,6,5]
*Main Map> group xs == pattern id xs
True