web-dev-qa-db-ja.com

Zip(関数型プログラミング)とは

最近、ClojureやScala(ご存じないのでごめんなさい))を見て、リストなどでZipを実行しました。Zipとは何で、どこから来たのですか?

45
Robert Gould

Zipは、2つの入力シーケンスを取り、同じ位置にある入力シーケンスからの2つごとの要素が何らかの関数を使用して結合される出力シーケンスを生成する場合です。 Haskellの例:

入力:

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

出力:

[5, 7, 9]

上記はより一般的な定義です。場合によっては、Zipは要素の組み合わせをタプルとして具体的に参照します。例えば。再びHaskellで:

入力:

Zip [1, 2, 3] [4, 5, 6]

出力:

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

そして、より一般的なバージョンは「Zip with」と呼ばれます。 「Zip」は「zipWith」の特殊なケースと見なすことができます。

Zip xs ys = zipWith (\x y -> (xs, ys)) xs ys 
74
Pavel Minaev

Zipは、マップやフォールドなどの一般的な関数型プログラミング手法です。これらの関数は、Rubyおよびpythonまでの初期のlispsにあります。これらは、リストに対して一般的なバッチ操作を実行するように設計されています。

この特定のケースでは、Zipは2つのリストを取り、それらのリストからタプルの新しいリストを作成します。

たとえば、(1,2,3)のリストと( "one"、 "two"、 "three")のリストがあるとしましょう。それらを一緒に圧縮すると、List((1、 "one")になります。 )、(2、 "2")、(3、 "3"))

またはscalaコマンドラインから、次のようになります。

scala> List(1,2,3).Zip(List("one","two","three"))
res2: List[(Int, Java.lang.String)] = List((1,one), (2,two), (3,three))

関数型プログラミングを知らずにPythonで初めて見たとき、それは圧縮形式に関連していると思いました。関数型プログラミングについてさらに学んだ後、それをますます使用しました。

20
drudru

残念ながら、トップアンサーにコメントを残すだけのポイントはありませんが、

Zip xs ys = zipWith xs ys (\x y -> (xs, ys))

is wrong、is should be:

Zip xs ys = zipWith (\x y -> (x,y)) xs ys

または単に:

Zip = zipWith (\x y -> (x,y))
10
bseibold

Pythonでは次のコードを使用できます。


>>> a = [1,2]
>>> b = [3,4]
>>> Zip(a,b)
[(1,3),(2,4)]
7
Geo

Pavelの答えはそれをかなり説明しています。 F#の例を提供します。

let x = [1;2]
let y = ["hello"; "world"]
let z = Seq.Zip x y

zの値は、2つのシーケンスの同じ位置にあるアイテムのタプルを含むシーケンスになります。

[(1, "hello"); (2, "world")]
6
Mehrdad Afshari