我们叫这个(新的)什么高阶函数?

2024-10-01 00:22:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我想给一个高阶函数起个新概念。重要的是,下面是用Python和Haskell编写的代码来演示这个概念,后面将对此进行解释。在

Python:

>>> def pleat(f, l):
       return map(lambda t: f(*t), zip(l, l[1:]))
>>> pleat(operator.add, [0, 1, 2, 3])
[1, 3, 5]

哈斯克尔:

^{pr2}$

正如您可以推断的那样,序列正在被迭代,利用相邻元素作为传递给它的函数的参数,将结果投影到一个新的序列中。那么,有人看到我们创建的功能了吗?功能社区的人对此是否熟悉?如果没有,我们叫它什么名字?在

---- Update ----

打褶获胜!在

Prelude> let pleat xs = zip xs (drop 1 xs)
Prelude> pleat [1..4]
[(1,2),(2,3),(3,4)]

Prelude> let pleatWith f xs = zipWith f xs (drop 1 xs)
Prelude> pleatWith (+) [1..4]
[3,5,7]

Tags: 函数代码功能概念returnhaskelldef序列
3条回答

既然它与“fold”类似,但不会将列表折叠为一个值,那么“crease”怎么样?如果你一直“折痕”,你最终会“折叠”(有点)。在

我们可以用一个烹饪隐喻,称之为“捏”,就像捏馅饼的外壳,尽管这可能意味着一个循环的拉链,其中列表的最后一个元素与第一个元素配对。在

def pinch(f, l):
    return map(lambda t: f(*t), zip(l, l[1:]+l[:1]))

(如果你只喜欢“折痕”或“捏”中的一个,请注意作为评论。这些是单独的建议吗?)在

嗯。。。对位。在

(`ap` tail) . zipWith

不值得一个名字。在

顺便说一句,水银说:

^{pr2}$

阿兹台克数列之神

我在Python中确实看不到任何编码的名称,这是肯定的。”“合并”这个词很好,但在其他各种语境中也有使用“犁头”往往是不用的,它提供了一种很好的视觉效果,可以平稳地推过一排土壤。也许我花了太多时间在园艺上。在

我还扩展了这个原则,允许函数接收任意数量的参数。在

你也可以考虑:褶皱。它很好地描述了你拿一张单子的方式(就像一条长长的织物),并把它的各个部分聚在一起。在

import operator

def stagger(l, w):
    if len(l)>=w:
        return [tuple(l[0:w])]+stagger(l[1:], w)
    return []

def pleat(f, l, w=2):
    return map(lambda p: f(*p), stagger(l, w))

print pleat(operator.add, range(10))
print pleat(lambda x, y, z: x*y/z, range(3, 13), 3)
print pleat(lambda x: "~%s~"%(x), range(10), 1)
print pleat(lambda a, b, x, y: a+b==x+y, [3, 2, 4, 1, 5, 0, 9, 9, 0], 4)

相关问题 更多 >