2014-09-26 15 views
7

내일 필자는 기능적 프로그래밍에 대한 소개를 완료하기 위해 시험을 준비하고 있지만 이해할 수없는 것이 하나있다. 그가하는 일은 그가 목록에서 첫 번째 요소를 소요하고 나머지 계속 것입니다하스켈 : non-exhaustive-patterns

test [] = [] 
test (x:xs) = test (xs) 

: 나는 같은 프로그램을 할 때마다

. 왼쪽에 하나만있을 때마다 xs[]이어야하며 차례로 test [] = []을 트리거해야합니다. 하지만이 알고리즘을 실행할 때마다 오류가 발생합니다. Exception: <interactive>:20:5-16: Non-exhaustive patterns in function test.

온라인에서 명확한 설명을 찾을 수 없습니다. 누군가가 나에게 이것이 명확하게 설명되거나 나에게 설명하는 링크를 보내 주시겠습니까?

+1

이상한. 게시 한 코드 스 니펫에는 비 한정적인 패턴이 포함되어 있지 않습니다. – pyon

+1

어둠 속에서 방금 촬영 : 아마도이 정의를 ghci에 입력하려고합니까? 그렇다면 하나의 let 문을 사용해야합니다 :'let test [] = []; test (x : xs) = test xs'입니다. – pyon

+0

예, 그게 내가하고있는 일입니다. 고마워요. 나는 일주일 내내 프로그래밍 재귀를 보냈고, 왜 이것이 작동하지 않는지 알 수 없었기 때문에 놀랐습니다. –

답변

24

질문의 본문 에 올린 코드는 완전한 패턴 일치를 수행합니다. 당신이 here을 뭐

Prelude> let test [] = [] ; test (x:xs) = test xs 

가 잘못된 : 당신이 ghci로이 정의를 입력하려고 할 경우, 당신은 하나의let 문을 사용합니다. 먼저이 아닌 완전한 기능 test 정의됩니다

Prelude> let test [] = [] 

을 그리고 당신은 에게 숨 깁니다 또한 test라는 또 다른이 아닌 철저한 기능, 첫 번째 정의됩니다

Prelude> let test (x:xs) = test xs 
+1

나는이 더 많은 시간 upvote 수 있었으면 좋겠다. –

4

이것은이다 정말로 하스켈의 REPL (GHCi)에서 아기 프로그램을 시험해 보는 것에 대해 매우 까다로운 일입니다.

let을 사용하는 것은 명확하지 않습니다 (특히 별도의 '스크립트/프로그램'에서는 필요하지 않으므로).

때때로 우리는 본격적인 파일을 만들고 싶지 않고 대신에 다른 '사례'가있는 작은 함수로 실험하려고합니다.

또 다른 유용한 접근법은 우리의 기능 범위를 정의하기 위해 구분 기호 :{ & :}을 사용하는 것입니다.

우리는 숫자 목록을 추가 할 수있는 간단한 재귀 sum 함수를 시험해보기를 원한다고 가정 해보십시오. 그러면 다음과 같이 말합니다 :

λ > :{ 
Prelude| sum [] = 0 
Prelude| sum (x:xs) = x + sum xs 
Prelude| :} 
sum :: Num t => [t] -> t 
Prelude 
λ > sum [1..10] 
55 
it :: (Enum t, Num t) => t 

우리가 지금 우리 기능의 범위를 얼마나 잘 보는지주의하십시오!

희망이 도움이됩니다. 건배!