2017-11-03 23 views
1

나는 여기에서 모든 것을하려고했지만 아무 일도 없었습니다. 비어있는 목록으로 호출하면 코드가 제대로 작동하지만 빈 목록 []을 넣 자마자 문제가 발생합니다. 출력은 짧은리스트의 길이와 입력리스트의 머리입니다 튜플에서 생성 된 목록이 될 예정이다더미 유형 SML

fun zip(xs1, x2) = 
    case xs1 of 
     [] => [] 
     | (h1::t1) => (case x2 of 
          [] => [] 
          | (h2::t2) => (h1, h2) ::zip(t1,t2)); 

: 그것은 '더미 유형'경고 및 다음 코드에 약간의 오류가 나타납니다. 그림에서 볼 수 있듯이 적어도 빈리스트로 함수를 호출 할 때 컴파일러가 인식하지 않는 코드 자체에는 오류가 없다.

솔직히 무슨 일이 일어나고 있는지 전혀 모르겠습니다. 누군가이 유형의 오류가 무엇을 의미하는지 설명해 주시겠습니까? 코드를 수정하지 못하게하려면 어떻게해야합니까?

답변

1

처음 시도하면 올바르게 압축됩니다. 두 번째 시도에서 두 목록 사이의 쉼표를 잊어 버리고 있습니다. 세 번째 시도에서는 성공하지만 첫 번째 매개 변수는 최상위 수준에서 다형성이므로 value restriction이 발생합니다.

우편의 예쁜 버전 :

fun zip ([], _ys) = [] 
    | zip (_xs, []) = [] 
    | zip (x::xs, y::ys) = (x,y)::zip (xs, ys) 

그리고 짧은, 해당 버전 :

fun zip (x::xs, y::ys) = (x,y)::zip (xs, ys) 
    | zip _ = [] 

Moscow ML's ListPair module에서 지퍼의 꼬리 재귀 버전 :

fun zip (xs, ys) = 
    let fun helper (x::xr, y::yr, result) = helper (xr, yr, (x,y)::result) 
      | helper (_, _, result) = List.rev result 
    in zip' (xs, ys, []) end