2014-06-22 6 views
1

하스켈 (3 일째 언어 학습)에 처음으로 익숙하며 패턴 일치에 문제가 있습니다. 나는 아래의 함수 doubleEveryOther을 정의했으며 가능한 한 세 가지 시나리오를 다루었 다. 빈리스트, 길이리스트 == 1,리스트 길이> 1. 코드는 잘 컴파일되지만 함수를 사용하려고하면 비 철저한 패턴 일치 오류 던져 :하스켈 패턴 일치 경고

*** Exception: ex2.hs:(3,1)-(5,55): Non-exhaustive patterns in function doubleEveryOther 

을 그때 GHCI에서 경고를 활성화하고, 나는 ex2.hs 파일을로드 할 때 다음과 같은 경고를 발견 :

ex2.hs:3:1: Warning: 
    Pattern match(es) are non-exhaustive 
    In an equation for `doubleEveryOther': 
     Patterns not matched: _ : (_ : (_ : _)) 

이 라인이 3 : 1이 의미를 내가 겉으로 드러낸 것으로 생각하는 빈 상자에 doubleEveryOther [] = []

내가 여기서 잘못 본 곳을 볼 수 없다. 도움말 감사.

건배

-- file: ex2.hs 
doubleEveryOther :: [Integer] -> [Integer] 
doubleEveryOther [] = [] 
doubleEveryOther (x:[]) = [x] 
doubleEveryOther (_:[xs]) = take (length [xs] - 1) [xs] 

답변

5

문제 세번째 패턴이다 (x:[xs][x,xs] 등가이므로)

doubleEveryOther (_:[xs]) 

이 패턴은 두 가지 요소가리스트 인 경우 일치한다. 정확한 구문은 다음

doubleEveryOther (_:xs) 
+0

알 수 있습니다. 나는 현재 비어있는 패턴 1과 2를 가지고 있지만 2 이상의 패턴은 가지고 있지 않다. 위의 값으로 변경하면 1, 2 또는 그 이상의 빈 패턴을 얻을 수 있습니다. 감사. 경고가 두 번째 패턴을 포함하고 세 번째 패턴이 아닌 라인을 참조하는 이유를 알고 있습니까 (4 번 라인이 아닌 3 번 라인)? 필자는 경고 메시지를 사용하여 코드를 수정하는 데 어려움을 겪었으며 아마도 이것이 큰 요인 일 것입니다. – Dave0504

+0

@ Dave0504 제 생각에 그것은 단지 패턴 매칭의 첫 번째 줄을 말하는 것 같습니다. GHC 경고에서 전체 스팬을 제공합니다. (3,1) - (5,55) – Benesh

4

라인

doubleEveryOther (_:[xs]) = take (length [xs] - 1) [xs] 

xs 소자를 포함하는 단일 요소 목록 다음에 바인드 헤드 2 요소의 목록을 일치한다. 당신은 당신이 drop 1을 사용할 수 있습니다

doubleEveryOther (_:xs) = take (length xs - 1) xs 

대신 take (n-1)의 사용해야합니다

doubleEveryOther (_:xs) = drop xs 

또는 일치 사용 : 당신은 아마이 경우에 재귀 호출을 만들고 싶어

(_:_:xs) = xs 

합니다.

+0

감사합니다. – Dave0504