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匹配。总体而言,您的显式解决方案可能是一个更好的选择。