2017-10-28 6 views
3

하나 하나가 오류를 얻을 길이가 다른 두 개의 목록을 압축하려고하면 :길이가 다른 두 개의 목록을 왜 압축 할 수 없습니까? F 번호에

:

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

그러나 길이가 다른 두 개의 인수 목록을 받아 우편의 또 다른 정의를 정의하는 것은 매우 쉽습니다

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은 시퀀스가 ​​게으르므로 게르만이며 디자인 상 의도적으로 시퀀스를 정의 할 때 소비자가 모든 것을 읽지 않을 것으로 예상하므로 더 긴 목록을 자르는 것이 현명한 것입니다.

은 요약하면, 나는 행동의 차이에 따라 생각 "어떤 주어진 데이터 구조를 위해 할 수있는 가장 현명한 일이다",하지만 훨씬 더 나을 작업에 대한 두 개의 이름을 가지고 생각 zip (아아, 지금은 변경하기가 거의 불가능합니다) 모두를 호출하는 것보다.

+0

우리가 라이브러리의 기능에 따라 다른 이름을 부여한다면,'exist2','forall2','iter2','map2'에 대한 대안을 찾아야 할 것입니다. – kaefer