这种"过滤"功能是否存在?什么是这样一个功能的好名字?

Mat*_*rog 1 haskell functional-programming naming-conventions

我正在解决项目欧拉问题,该问题涉及具有特定属性的所有n位数字.似乎获取它们的最简单方法可能是获取具有该属性的所有数字的列表(这将是无限长的),然后选择具有正确数字位数的数字.像这样:

numsWithCoolProperty = filter hasCoolProperty [1..]

nDigitNumsWithCoolProperty n = takeWhile (< 10^n) $ dropWhile (<= 10^(n-1)) numsWithOtherCoolProperty
Run Code Online (Sandbox Code Playgroud)

但是现在如果我想用不同的属性做同样的事情,我会重复自己:

nDigitNumsWithOtherCoolProperty n = takeWhile (< 10^n) $ dropWhile (<= 10^(n-1)) numsWithOtherCoolProperty
Run Code Online (Sandbox Code Playgroud)

所以我想要一个捕获dropWhile/takeWhile逻辑的函数.就像是:

f :: (a -> Bool) -> [a] -> [a]
f pred = takeWhile pred . dropWhile (not . pred)
Run Code Online (Sandbox Code Playgroud)

如果我有一个谓词hasNDigits n m,如果m有n个数字,则返回true,我可以这样做:

nDigitNumsWithCoolProperty n = f (hasNDigits n) numsWithCoolProperty
nDigitNumsWithOtherCoolProperty n = f (hasNDigits n) numsWithOtherCoolProperty
Run Code Online (Sandbox Code Playgroud)

无论如何,我的问题是关于与fdropWhile和takeWhile具有相同类型的函数:它是否已存在于某处?如果没有,那么它的名字会是什么?我能想到的就是这样,dropUntilTakeWhile但我确信那里有一个更好的名字.

Don*_*art 7

你的功能:

f pred = takeWhile pred . dropWhile (not . pred)
Run Code Online (Sandbox Code Playgroud)

强烈相关spanbreak功能,你可以看到:

span  :: (a -> Bool) -> [a] -> ([a], [a]) 

break :: (a -> Bool) -> [a] -> ([a], [a])       
Run Code Online (Sandbox Code Playgroud)

我们来看一些例子:

> 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])
Run Code Online (Sandbox Code Playgroud)

和你的功能:

> f (< 3) [1,2,3,4,1,2,3,4]
[1,2]
Run Code Online (Sandbox Code Playgroud)

现在,我们有一个关于法律spantakeWhiledropWhile,

span p xs相当于 (takeWhilep xs,dropWhilep xs)

所以我们可能会考虑你的功能部件spanbreak功能组.它也与lexing有关,在那里你收集一些与谓词匹配的标记.

所以,你可以称这个函数gatherlex类似的东西.