将高阶函数从Python转换为Has

2024-06-16 13:29:43 发布

您现在位置: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))

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接受任何函数和任何序列,并将序列中的前几个元素作为参数传递到接收函数中。在

在哈斯凯尔有办法做到这一点还是我在做梦?在


Tags: lambda函数代码importlenreturnifdef
1条回答
网友
1楼 · 发布于 2024-06-16 13:29:43

以下类型签名是可选的:

stagger :: [a] -> Int -> [[a]]
stagger l w
    | length l >= w  =  take w l : stagger (tail l) w
    | otherwise      =  []

pleat :: ([a] -> b) -> [a] -> Int -> [b]
pleat f l w = map f $ stagger l w

main = do
    print $ pleat (\[x, y] -> x+y) [0..9] 2
    print $ pleat (\[x, y, z] -> x*y/z) [3..12] 3
    print $ pleat (\[x] -> "~" ++ show x ++ "~") [0..9] 1
    print $ pleat (\[a, b, x, y] -> a+b == x+y) [3, 2, 4, 1, 5, 0, 9, 9, 0] 4

其思想是,该函数显式地将未知长度的列表作为参数,因此它不是很安全的类型。但它几乎是Python代码的一对一映射。在

相关问题 更多 >