Имеет ли Haskell функцию takeUntil?

В настоящее время я использую

takeWhile (\x -> x /= 1 && x /= 89) l

чтобы получить элементы из списка до 1 или 89. Однако результат не включает эти контрольные значения. Имеет ли Haskell стандартную функцию, которая предоставляет этот вариант на takeWhile, который включает в себя дозорный результат? Мои поиски с Hoogle до сих пор бесплодны.

Ответ 1

Поскольку вы спрашивали о стандартных функциях, no. Но также нет пакета, содержащего takeWhileInclusive, но это очень просто:

takeWhileInclusive :: (a -> Bool) -> [a] -> [a]
takeWhileInclusive _ [] = []
takeWhileInclusive p (x:xs) = x : if p x then takeWhileInclusive p xs
                                         else []

Единственное, что вам нужно сделать, - принять значение независимо от того, вернет ли предикат True и использовать предикат в качестве фактора продолжения:

*Main> takeWhileInclusive  (\x -> x /= 20) [10..]
[10,11,12,13,14,15,16,17,18,19,20]

Ответ 2

Является span, что вы хотите?

matching, rest = span (\x -> x /= 1 && x /= 89) l

затем посмотрите на голову rest.