【问题标题】:Convert higher order function from Python to Haskell将高阶函数从 Python 转换为 Haskell
【发布时间】:2010-10-14 21:19:43
【问题描述】:

我有以下代码:

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

有没有办法在 Haskell 中做到这一点,还是我在做梦?

【问题讨论】:

    标签: python haskell higher-order-functions


    【解决方案1】:

    下面的类型签名是可选的:

    交错 :: [a] -> Int -> [[a]] 错开 |长度 l >= w = 取 w l :交错(尾 l) w |否则 = [] 褶皱 :: ([a] -> b) -> [a] -> Int -> [b] 褶皱 f l w = 地图 f $ 交错 l w 主要=做 打印 $ 褶皱 (\[x, y] -> x+y) [0..9] 2 打印 $ 褶皱 (\[x, y, z] -> x*y/z) [3..12] 3 打印 $ 褶 (\[x] -> "~" ++ 显示 x ++ "~") [0..9] 1 打印 $ 褶 (\[a, b, x, y] -> a+b == x+y) [3, 2, 4, 1, 5, 0, 9, 9, 0] 4

    这个想法是该函数明确地将未知长度的列表作为参数,因此它不是非常安全的。但它几乎是 Python 代码的一对一映射。

    【讨论】:

    • 有没有办法写成可以传入 (+) 而不是 (\[x,y] -> x+y) ?
    • @Legatou:没有。除了拼写不同:lift2 f [x,y] = f x y、print $ pleat (lift2 (+)) [0..9] 2。 Haskell 不做多变量函数(typeclass 黑客会告诉你否则,但它会变成“不擅长”)。没有它们,总有一种方法可以清楚地说明您的意思。
    • 我接受这个答案是有效的......虽然令人沮丧。我有点希望我可以像我最终在这里所做的那样动态评估参数计数:ishpeck.com/4squirrel/pleat.html
    • 也许“动态”这个词是 Haskell 不这样做的线索?
    • @Legatou 虽然不完全相同,但该函数至少是 Prelude.sum 的子函数。所以你可以用 (\[x,y] -> x+y) 代替 sum ...
    猜你喜欢
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    相关资源
    最近更新 更多