问题 Haskell有一个takeUntil函数吗?


目前我正在使用

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

从列表中获取元素到1或89.但是,结果不包括这些sentinel值。 Haskell是否具有提供此变体的标准功能 takeWhile 包括结果中的哨兵?到目前为止,我对Hoogle的搜索一直没有用。


12463
2018-03-18 07:10


起源



答案:


既然你问的是标准函数, 没有。但是也没有一个包含的包 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]

8
2018-03-18 07:14



我对Haskell来说已经足够新了,无论如何我自己实施这些东西可能是一个很好的练习。谢谢你的建议。 - Code-Apprentice


答案:


既然你问的是标准函数, 没有。但是也没有一个包含的包 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]

8
2018-03-18 07:14



我对Haskell来说已经足够新了,无论如何我自己实施这些东西可能是一个很好的练习。谢谢你的建议。 - Code-Apprentice


span 你想要什么?

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

然后看看头部 rest


4
2018-03-18 08:45



在那种情况下,我认为你需要 span 代替 break 为了符合OP的规范。 - Xavier Pinho
啊,是的,当然。它刚刚发生在我身上 break的谓词是颠倒的,但我不知道 span。我会相应地更新答案! - sanityinc
@sanityinc:我也记得那个,但是你需要谨慎一点 rest 可能 []。 - Zeta
@Zeta确实是 - 我避免了缺点 rest 因为这个原因的例子。您的明确解决方案可能是一个更好的选择。 - sanityinc