하스켈 (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]
알 수 있습니다. 나는 현재 비어있는 패턴 1과 2를 가지고 있지만 2 이상의 패턴은 가지고 있지 않다. 위의 값으로 변경하면 1, 2 또는 그 이상의 빈 패턴을 얻을 수 있습니다. 감사. 경고가 두 번째 패턴을 포함하고 세 번째 패턴이 아닌 라인을 참조하는 이유를 알고 있습니까 (4 번 라인이 아닌 3 번 라인)? 필자는 경고 메시지를 사용하여 코드를 수정하는 데 어려움을 겪었으며 아마도 이것이 큰 요인 일 것입니다. – Dave0504
@ Dave0504 제 생각에 그것은 단지 패턴 매칭의 첫 번째 줄을 말하는 것 같습니다. GHC 경고에서 전체 스팬을 제공합니다. (3,1) - (5,55) – Benesh