2017-10-28 15 views
3

一一は、エラーを取得し、長さの異なる二つのリストを圧縮しようとした場合:なぜ異なる長さの2つのリストを圧縮できないのですか? F#ので

List.zip [1..4] [1..3] 
// System.ArgumentException: The lists had different lengths. 

しかし、長さの異なる2つの引数リストを受け入れたzipの代わりの定義を定義することは非常に簡単です。

let rec zip' (xs: 'T list) (ys: 'T list) = 
     match (xs, ys) with 
     | ([], _) -> [] 
     | (_, []) -> [] 
     | ((z::zs), (w::ws)) -> (z, w) :: zip' zs ws 

zip' [1..4] [1..3] 
// val it : (int * int) list = [(1, 1); (2, 2); (3, 3)] 

この代替定義を使用しない理由はありますか?なぜそれが最初に採用されなかったのですか?

答えて

7

List.zip(これを許可しない)とSeq.zip(長いリストを切り捨てる)の間に不一致があるため、これは実際に少し混乱します。

  • 私は同じ長さのリストに取り組んでいますzipは、合理的なデフォルトの動作であることを考える - それは自動的に切り捨てられたデータならば、発生する可能性がありますzipを使用しているときに誤っていくつかの有用なデータを失うことを現実的な可能性があります微妙なバグ。

  • Seq.zipが長いリストを切り捨てるという事実は、シーケンスが怠け者であり、意図的にシーケンスを定義するときに消費者がそれをすべて読んでいない可能性があるためです。

は要約すると、私は行動の差が基づいていると思う「何を与えられたデータ構造のために行うための最も賢明な事はある」が、私は多くの理にかなって操作するための2つの名前を持つと思いますかzipの両方を呼び出すよりも(悲しいかな、今はほとんど変更できません)。

+0

ライブラリ関数に振る舞いに基づいて異なる名前を付ける場合は、 'exist2'、' forall2'、 'iter2'、' map2'の代替案も提示する必要があります。 – kaefer

関連する問題