1

splatterこの Python コードを検討してください。

def splatter(fn):
    return lambda (args): fn(*args)

def add(a, b):
    return a + b

list1 = [1, 2, 3]
list2 = [4, 5, 6]
print map(splatter(add), zip(list1, list2))

n個の圧縮されたシーケンスにn項関数をマッピングすることは、すでに名前が付けられている可能性があるほど一般的な操作のようですが、どこでそれを見つけることができるかわかりません。それは漠然とカリー化を連想させ、私が聞いたことのない他の関連する引数中心の HOF があるようです。これが「よく知られている」関数であるかどうかは誰にもわかりますか? それについて議論するとき、私は現在、質問のタイトルで使用されているタイプの厄介な言語にこだわっています.

編集

うわー、Pythonmapはこれを自動的に行います。あなたは書ける:

map(add, list1, list2)

そして、それは正しいことを行い、splatterあなたの関数を ing する手間を省きます。唯一の違いはzip、長さが最短の引数の長さであるリストを返すのに対し、mapは短いリストを で拡張することNoneです。

4

2 に答える 2

1

あなたが探している関数だと思いますzipWith(この名前は少なくともHaskellで使用されています)。もう少し一般的です。HaskellzipWithでは、次のように定義されています (最初の行は単なる型です)。

zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith f (a:as) (b:bs) = f a b : zipWith f as bs
zipWith _ _      _      = []

そして、あなたの例は次のようになります

zipWith (+) [1, 2, 3] [4, 5, 6]

私は python をよく知らないので、「zipWith analog in Python?」を指すことしかできません。

于 2013-03-11T06:30:41.353 に答える
0

これは「よくある質問」のリストでたまたま見つけたもので、答えがわかったことに驚きました。

私が尋ねた機能には2つの解釈があります。

1 つ目は、固定数の引数を取る関数を取得し、それらの引数を固定サイズのリストまたはタプルとして受け取る関数に変換するという私の意図でした。Haskell では、この操作を行う関数を と呼びuncurryます。

uncurry :: (a -> b -> c) -> ((a, b) -> c)

(わかりやすくするために括弧を追加しています。)

Haskell では表現できませんが、これを 3 つ以上の引数を持つ関数に拡張することは容易に想像できます。しかし、、、uncurry3などuncurry4は場違いではありません。

つまり、「漠然とカレーを連想させる」というのは正しかったのです。


2 番目の解釈は、意図的に可変数の引数を取る関数を取り、単一のリストを取る関数を返すことです。

splatは Python の構文構造として非常に奇妙であるため、これを推論するのは困難です。

しかし、たとえば、「スプラッティング」のためのファーストクラスの名前付き関数を持つ JavaScript を想像すると:

varFn.apply(null, args)

var splatter = function(f) {
    return function(arg) {
        return f.apply(null, arg);
    };
};

apply次に、それを " " 関数の単なる部分的な適用として言い換えることができます。

var splatter = function(f) {
    return Function.prototype.apply.bind(f, null);
};

または、アンダースコアのpartialを使用して、ポイントフリーの定義を考え出すことができます。

var splatter = _.partial(Function.prototype.bind.bind(Function.prototype.apply), _, null)

はい、それは悪夢です。

(代わりに_.partial、ある種のswapヘルパーを定義する必要があり、さらに読みにくくなると思います。)

したがって、この操作の名前は単に「」の部分的な適用であると思いますapply。または、Python の場合は、splat 演算子のセクションのようなものだと思います (splat が「実際の」演算子である場合)。


しかし、クリスが指摘したように、元の質問の、、、およびの特定の組み合わせuncurry正確zipです。実際、HLintにはデフォルトで、この複雑な構造を への 1 回の呼び出しに置き換える規則が含まれています。mapzipWithzipWith


イアンを過ぎて、問題が解決することを願っています。

于 2016-03-04T19:45:13.820 に答える