2

次のコードがあります。

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でこれを行う方法はありますか、それとも私は夢を見ていますか?

4

1 に答える 1

6

以下の型シグネチャはオプションです。

stagger :: [a] -> Int -> [[a]]
よろめく lw
    | | 長さ l >= w = 取る wl : スタガー (テール l) w
    | | それ以外の場合 = []

プリーツ :: ([a] -> b) -> [a] -> Int -> [b]
プリーツ flw = マップ f $ スタガー lw

メイン = する
    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 コードの 1 対 1 のマッピングです。

于 2010-10-14T21:30:53.177 に答える