2014-09-18 3 views
2

내가 생각할 수있는 모든 기본 사례로 일부 sml 코드를 작성했지만, 여전히이 경고가 표시됩니다. 따라서 함수는 첫 번째 목록이 두 번째 목록의 순열인지 검사합니다. 그것이 무한 루프에 들어가는 것을 나는 생각할지라도 확실하지 않은 Im!경고 : match nonexhaustive

fun isPermutation(nil: int list, nil: int list): bool = true 
    | isPermutation(x::nil, nil) = false 
    | isPermutation(nil, y::nil) = false 
    | isPermutation(x1::nil, x2::nil) = if (x1=x2) then true else false 
    | isPermutation(x1::l1, x2::l2) = isPermutation(x1::nil, x2::l2) andalso isPermutation(l1, x2::l2) 

답변

1

그래서 이들은 당신이 가지고있는 경우입니다 (x,y)([], [1,2,3]) 경우

(nil, nil) 
(x::nil, nil) 
(nil, y::nil) 
(x1::nil, x2::nil) 
(x1::l1, x2::l2) 

그러나,이 함수는 이러한 경우 전혀 일치하지 않습니다. 이는 (x::nil, nil)(nil, y::nil) 행에서 인수 중 하나가 nil 인 경우 다른 하나는 단일 톤 목록 (하나의 요소 만 포함하는 목록)이어야한다고 가정하기 때문입니다. 이 경우 (_, nil)(nil, _)을 사용하면 싱글 톤이 아닌 다른 가능한 목록을 포함하게되므로 비 완전 일치 경고가 제거됩니다.

은 와일드 카드 위치에서 튜플 요소에 액세스하기 위해 x 또는 y을 사용할 수 있으므로 새로운 값 바인딩을 생성하지 않는 패턴의 와일드 카드입니다.