【发布时间】:2010-09-22 23:03:38
【问题描述】:
我试图说出我认为是高阶函数的新想法。最重要的是,这里是用 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]
哈斯克尔:
Prelude> let pleatWith f xs = zipWith f xs (drop 1 xs)
Prelude> pleatWith (+) [0,1,2,3]
[1,3,5]
正如您可能推断的那样,序列正在被迭代,利用相邻元素作为您传递它的函数的参数,将结果投影到新序列中。那么,有人看过我们创建的功能吗?这对职能社区的人来说是不是很熟悉?如果不是,我们给它取什么名字?
---- 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]
【问题讨论】:
-
自然必须很短。所以犁在那里获胜。我的问题是它是否重要到值得一个名字。它有哪些应用程序,我们会经常使用它,以至于我们不会只使用单线 zipWith?
-
我不知道它是否有名字,但我知道我已经遵循了很多这种模式。我很想知道它是否有一个通用名称。我通常将其称为“合并”,因为您将价值观合并在一起。
-
@lshpeck:基本库的快速search says no。它确实不属于基本库,因为它很容易重新创建但没有被广泛使用。我也会质疑为这样一个小功能添加包依赖项的价值。在 hackage MissingH 或 ListLike 是找到此类功能的两个可能的地方,但它不存在。
-
别再想出一些没人会理解的可爱的小流行语来用于晦涩的、特殊目的的操作了。甚至不要考虑像“合并”这样的通用名称。使用描述性短语,例如。
apply_to_pairs. -
所以我在 Haskell Reddit 上发布了这个,他们很聪明 (reddit.com/r/haskell/comments/dhlso/…): let meld f = map (uncurry f) 。 (zip
aptail)
标签: python haskell functional-programming theory higher-order-functions