我有以下代码:

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))

if __name__=="__main__":
    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)

重要部分:Pleat接受任何函数和序列,并将该序列中的前几个元素作为参数传递给接收的函数。
哈斯克尔有办法做到这一点吗?还是我在做梦?

最佳答案

下面的类型签名是可选的:
交错::[a]->Int->[[a]]
错开
|长度l>=w=取w l:交错(尾部l)w
|否则=[]
褶:([a]>b)>[a]>Int->[b]
pleat f l w=地图f$stagger l w
主=do
打印$pleat(\[x,y]>x+y)[0..9]2
打印$pleat(\[x,y,z]>x*y/z)[3..12]3
打印$pleat(\[x]>“~”++显示x++“~”)[0..9]1
打印$pleat(\[a,b,x,y]>a+b==x+y)[3,2,4,1,5,0,9,9,0]4
其思想是该函数明确地将未知长度的列表作为参数,因此它不是很安全的类型。但它实际上是Python代码的一对一映射。

关于python - 将高阶函数从Python转换为Haskell,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3937683/

10-12 14:12