2017-09-11 4 views
0
私たちは、あなたが機能し、2つのコレクション

map関数を使用して、2つのseqを1つに変換します。 Scalaの

(map + [1 2 ] [4 5 ]) ;;=> (5 7) 

を提供することができますマップ機能を持っているClojureの中

はScalaでは似た何かがあるのでしょうか?

私は理解のために試しましたが、私は4つの組み合わせを得ました。

理解のためとの方法がある場合、私は将来的に何らかのフィルタリングを行う必要があるため、/でも良いだろう

+0

、これはマップと組み合わせただけのzip操作、です。 Clojureのようなものが 'map'にジッパーの動きを与えたのはちょっと便利なことです。 – Carcigenicate

答えて

5

あなたはマップ、その後、1に2つのコレクションを組み合わせることが.zip最初に使用することができます。

seq1.zip(seq2).map { case (x, y) => x + y } 

私は理解できないと思います。 .filterまたは.filterNotも呼び出してフィルタリングできます。

0

は本当にここに何か新しいものを追加していないが、多分これは役立ちます:

def mapCollections[A,B,C](as: Seq[A], bs: Seq[B])(f: (A,B) => C): Seq[C] = 
    as zip bs map f.tupled 

mapCollections(List(1, 2), List(4, 5))(_ + _) // = List(5, 7) 
1

@JoeKはあなたに特定の答えを与えます。

さらに2つの一般的な回答をご提供します。 Clojure、その他の多くの動的言語は、多くの場合、抽象的な抽象化になります(標準ライブラリのmapapplyの関数がこれの素晴らしい例です)。従属型が存在しない場合、これは静的型付き言語では困難です。代わりに表示される一般的なパターンは、必要な回数だけ関数の繰り返し適用です。あなたは

(map + [1 2 3] [4 5 6] [7 8 9]) 

を行うために必要な場合には、この場合、あなたは一般的に、この余分な定型がひどいではありません

xs.zip(ys).zip(zs).map{ case (x, (y, z)) => x + y + z } 

を行う必要があります。アーリーの抽象がより深刻に見逃されるのは、任意のタプルまたは任意のケースクラスを抽象化したいときです。それは、限定型の依存型を与えるScalaライブラリのShapelessが有効になります。

私はこのようなもののためにシェイプレスを打破しません。

2番目の一般的な点は、あなたが理解のために求めている方法でリストを圧縮することはできないということです(一般的にはそうではありませんが... Scalaのすべてのものを比較できるので最終的なフィルターのパスが、それは組み込みの平等があなたの望むものを与えないものでは失敗します)。この背後にある一般原則はもう少し微妙です。これらのコレクション機能の階層構造があることが判明しました。あなたはmapで始まります。 zipList.applyを追加すると、次のレベルにジャンプします。 zipflattenに置き換えると、別のレベルになります。 flattenでは、zipのバージョンを回復できますが、それ以外の方法で回復することはできません。

デフォルトのコレクションのためのScalaのflatMapflattenが(理解のために最終的にflatMap一連の呼び出しであることに注意)、すなわち、zipのフォームを生じさせず、同じタイプの署名で何か、それがあることが判明あなたが気づいたデカルト製品。

標準zipになるflattenのバージョンがありますが、すべてのコレクションが同じ長さであれば意味があります。これは、コレクションのコレクションから生じる正方行列の対角を取ることを含む。 Scalaの型システムは、一定の長さの制約を表現するのに十分強力ではないですし、一貫性のある長さを確保していない場合は、いくつかの奇妙な振る舞いを得ることができますので、

これは通常、有限のコレクションのためとして有用ではありません。一方

flatten

の「正常な」バージョンは過去の処理を受けることができないことになるのに対し、これは無限ストリームの実際に有用であるflattenflatMapのバージョン(List.applyの当量は無限一定の流れである)であります最初のストリーム。

サイドノート:(あなたには、いくつかのフィルタリングを行う可能性があります場所)あなたはもちろん、常に理解のために、後であなたのzip形式のリストを使用することができます。あなたは、理解のためにジッパー自体を実装することはできません。ほとんどの言語で

関連する問題