Ваша функция:
f pred = takeWhile pred . dropWhile (not . pred)
Сильно связана с функциями span
и break
, как вы можете видеть:
span :: (a -> Bool) -> [a] -> ([a], [a])
break :: (a -> Bool) -> [a] -> ([a], [a])
Давайте рассмотрим несколько примеров:
> span (< 3) [1,2,3,4,1,2,3,4]
([1,2],[3,4,1,2,3,4])
> break (< 3) [1,2,3,4,1,2,3,4]
([],[1,2,3,4,1,2,3,4])
и ваша функция:
> f (< 3) [1,2,3,4,1,2,3,4]
[1,2]
Теперь у нас есть один закон, относящийся span
к takeWhile
и dropWhile
,
span
p xs эквивалентно (takeWhile
p xs, dropWhile
p xs)
, поэтому мы можем рассмотреть вашу функцию как часть span
и break
группа функций.Это также относится к лексингу, где вы собираете некоторый токен, который соответствует предикату.
Итак, вы можете вызвать эту функцию gather
или lex
или что-то подобное.