Haskell有takeUntil函数吗?

Haskell有takeUntil函数吗?,haskell,functional-programming,Haskell,Functional Programming,目前我正在使用 takeWhile (\x -> x /= 1 && x /= 89) l 从最多为1或89的列表中获取元素。但是,结果不包括这些哨兵值。Haskell是否有一个标准函数,可以在takeWhile上提供此变体,并在结果中包含哨兵?到目前为止,我用Hoogle进行的搜索没有结果。自从您询问标准函数以来。但也没有包含takeWhileInclusive的包,但这非常简单: takeWhileInclusive :: (a -> Bool) -> [

目前我正在使用

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

从最多为1或89的列表中获取元素。但是,结果不包括这些哨兵值。Haskell是否有一个标准函数,可以在
takeWhile
上提供此变体,并在结果中包含哨兵?到目前为止,我用Hoogle进行的搜索没有结果。

自从您询问标准函数以来。但也没有包含
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]

span
是您想要的吗

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

然后看看
rest

的头部,我对Haskell来说已经足够新了,不管怎样,自己实现这些东西可能是一个很好的练习。谢谢你的建议。那样的话,我想你需要
span
而不是
break
,以符合OP的规范。啊,当然可以。我刚刚想到,
break
的谓词是颠倒的,但我不知道
span
。我会相应地更新答案@SanitinYnc:我也想到了这一点,但你需要小心一点,因为
rest
可能是
[]
@Zeta是的,确实如此——因为这个原因,我在示例中避免了
rest
上的一个cons匹配。总体而言,您的显式解决方案可能是一个更好的选择。