Haskell 这是不是;过滤“;功能存在吗?这样一个函数的好名字是什么?
我正在解决一个工程Euler问题,它涉及到所有具有特定属性的n位数字。似乎获取它们的最简单方法可能是获取具有该属性的所有数字的列表(无限长),然后选择具有正确位数的数字。像这样:Haskell 这是不是;过滤“;功能存在吗?这样一个函数的好名字是什么?,haskell,functional-programming,naming-conventions,Haskell,Functional Programming,Naming Conventions,我正在解决一个工程Euler问题,它涉及到所有具有特定属性的n位数字。似乎获取它们的最简单方法可能是获取具有该属性的所有数字的列表(无限长),然后选择具有正确位数的数字。像这样: numsWithCoolProperty = filter hasCoolProperty [1..] nDigitNumsWithCoolProperty n = takeWhile (< 10^n) $ dropWhile (<= 10^(n-1)) numsWithOtherCoolProperty
numsWithCoolProperty = filter hasCoolProperty [1..]
nDigitNumsWithCoolProperty n = takeWhile (< 10^n) $ dropWhile (<= 10^(n-1)) numsWithOtherCoolProperty
然后,如果我有一个谓词hasNDigits n m
,如果m有n个数字,它会返回true,我可以:
nDigitNumsWithCoolProperty n = f (hasNDigits n) numsWithCoolProperty
nDigitNumsWithOtherCoolProperty n = f (hasNDigits n) numsWithOtherCoolProperty
无论如何,我的问题是关于函数f
,它与dropWhile和takeWhile具有相同的类型:它是否已经存在于某个地方?如果不是的话,它的好名字是什么?我所能想到的是类似于DropUntiltMakeWhile的东西,但我确信有一个更好的名字。您的函数:
f pred = takeWhile pred . dropWhile (not . pred)
> f (< 3) [1,2,3,4,1,2,3,4]
[1,2]
与span
和break
功能密切相关,如您所见:
span :: (a -> Bool) -> [a] -> ([a], [a])
break :: (a -> Bool) -> [a] -> ([a], [a])
让我们看一些例子:
> 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])
>span(<3)[1,2,3,4,1,2,3,4]
([1,2],[3,4,1,2,3,4])
>中断(<3)[1,2,3,4,1,2,3,4]
([],[1,2,3,4,1,2,3,4])
你的职能是:
f pred = takeWhile pred . dropWhile (not . pred)
> f (< 3) [1,2,3,4,1,2,3,4]
[1,2]
>f(<3)[1,2,3,4,1,2,3,4]
[1,2]
现在,我们有一条关于span
和takeWhile
和dropWhile
的定律
span
pxs相当于
(takeWhile
pxs,dropWhile
pxs)
<> >我们可以考虑您的函数“代码>跨度S/<代码>和<代码>中断< /代码>函数组。它还与词法分析相关,在词法分析中,您收集一些与谓词匹配的标记
因此,您可以调用此函数gather
或lex
或类似的函数。您的函数:
f pred = takeWhile pred . dropWhile (not . pred)
> f (< 3) [1,2,3,4,1,2,3,4]
[1,2]
与span
和break
功能密切相关,如您所见:
span :: (a -> Bool) -> [a] -> ([a], [a])
break :: (a -> Bool) -> [a] -> ([a], [a])
让我们看一些例子:
> 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])
>span(<3)[1,2,3,4,1,2,3,4]
([1,2],[3,4,1,2,3,4])
>中断(<3)[1,2,3,4,1,2,3,4]
([],[1,2,3,4,1,2,3,4])
你的职能是:
f pred = takeWhile pred . dropWhile (not . pred)
> f (< 3) [1,2,3,4,1,2,3,4]
[1,2]
>f(<3)[1,2,3,4,1,2,3,4]
[1,2]
现在,我们有一条关于span
和takeWhile
和dropWhile
的定律
span
pxs相当于
(takeWhile
pxs,dropWhile
pxs)
<> >我们可以考虑您的函数“代码>跨度S/<代码>和<代码>中断< /代码>函数组。它还与词法分析相关,在词法分析中,您收集一些与谓词匹配的标记
因此,您可以调用此函数
gather
或lex
或类似的函数。您不需要在递归时使take-until+drop吗?否则,它将只在谓词匹配和非谓词匹配之间的单个转换上工作。(我一点也不懂语法,所以我不知道你对f
的定义是否已经做到了这一点)在这种特殊情况下,我知道numsWithCoolProperty
是排序的(我想我应该这么说),这意味着我知道所有三位数字都将被分组在一起。当它从两位数切换到三位数时,我想开始包括这些数字,当它从三位数切换到四位数时,我想停止。如果我不知道列表已排序(或者匹配谓词的所有数字都在一次运行中分组),那么我将使用过滤器。但我不能在这里这样做,因为这是一个无限列表,我想得到一个有限的列表。这没什么帮助,但你可以称它为takeRange
,并称它为谓词isInRange
另一种方法如何:nDigitNums n=[10^(n-1)…10^n-1]
然后对其进行过滤。我会简单地调用该函数dropTakeWhile
。您不需要将take-until+drop-while
递归吗?否则,它将只在谓词匹配和非谓词匹配之间的单个转换上工作。(我一点也不懂语法,所以我不知道你对f
的定义是否已经做到了这一点)在这种特殊情况下,我知道numsWithCoolProperty
是排序的(我想我应该这么说),这意味着我知道所有三位数字都将被分组在一起。当它从两位数切换到三位数时,我想开始包括这些数字,当它从三位数切换到四位数时,我想停止。如果我不知道列表已排序(或者匹配谓词的所有数字都在一次运行中分组),那么我将使用过滤器。但我不能在这里这样做,因为这是一个无限列表,我想得到一个有限的列表。这没什么帮助,但你可以称它为takeRange
,并称它为谓词isInRange
另一种方法如何:nDigitNums n=[10^(n-1)…10^n-1]
然后对其进行过滤。我只需调用该函数dropTakeWhile
。