2010-12-19 2 views
4
head' :: [a] -> a 
head' [] = error "No head for empty lists!" 
head' (x:_) = x 

head' :: [a] -> a 
head' xs = case xs of [] -> error "No head for empty lists!" 
         (x:_) -> x 

나는 쉽게 이해할 수없는 질문을하고 있습니다. 위 코드에서 입력에 대한 목록이 필요하다는 것을 알았습니다. 하지만 세 번째 줄에는 나를 혼란스럽게 말하는 (x:_)이 나와 있습니다. 누구나 [x:_] 대신에 (x:_)을 썼다고 설명 할 수 있습니까?(x : _)와 [x : _]는 무엇을 의미합니까?

그리고 더하기, 나는 무엇을 의미하는지 이해하지 못한다. (x:_).

감사합니다.

+2

여기에 힌트가 있습니다 :'(x : _)'는'[a]'타입이고'[x : _]'는'[[a]]'타입입니다. – delnan

답변

5

이것은 pattern matching이라는 개념입니다. :은 중위 생성자입니다. +은 중위 함수입니다. Haskell에서는 생성자와 패턴 매칭을합니다.

(1 : 2 : 3 : []) 

는 대괄호 표기법이 목록을 만들기위한 단지 문법 설탕이다, [1, 2, 3]과 동일합니다.

패턴 (x : _)은 목록의 첫 번째 요소를 x에 바인딩하고 나머지는 _에 상관하지 않는다는 것을 의미합니다.

+0

Adamse에게 감사드립니다. 나는 또한 합성 설탕이 무엇을 의미하는지 궁금합니다. 영어가 제 첫 언어가 아닙니다. – tpark

+2

http://en.wikipedia.org/wiki/Syntactic_sugar – bruno

14

:은 새로운 목록의 머리 부분을 왼쪽 인수로, 꼬리를 오른쪽 인수로 취하는 목록의 생성자입니다. 여기와 같은 패턴으로 사용하면 일치하는 목록의 머리 부분이 왼쪽 패턴과 오른쪽 꼬리 부분에 지정됩니다.

이 경우 목록의 머리글은 변수 x에 저장되며 꼬리는 사용되지 않습니다 (_은 값을 신경 쓰지 않는다는 의미입니다).

그렇습니다. []을 사용하여 목록과의 패턴 일치는 물론 고정 크기 목록 만 사용할 수 있습니다. 예를 들어, 패턴 [x]은 정확히 하나의 요소를 가진 목록과 일치하며,이 요소는 변수 x에 저장됩니다. 마찬가지로 [x,y]은 두 요소가있는 목록과 일치합니다.

따라서 제안 된 패턴 [x:y]은 하나의 요소가있는 목록과 일치하며 패턴 x:y과 일치합니다. 즉 정확히 하나의 목록을 포함하는 목록의 목록과 일치합니다.

+0

의견을 보내 주셔서 감사합니다. 나는 책이나 사이트가 있는지 당신이 mk을 권장합니다 haskell 초보자? – tpark

+2

Google은 당신에게 haskell을 배우게됩니다. – fuz

+0

@tpark :이 사이트에는 하스켈을 배우는 데 많은 조언이 들어 있습니다. 격주로 일어나는 질문 인 것 같습니다. 이 두 가지 질문은 유용한 답변을 제공합니다 : [ "How to Learn Haskell"] (http://stackoverflow.com/questions/1012573/how-to-learn-haskell)과 [ "초보자 가이드 하스켈"] (http : /stackoverflow.com/questions/16918/beginners-guide-to-haskell). 이 검색은보다 유용한 리소스를 제공합니다. [ "learn haskell"] (http://stackoverflow.com/search?q=learn+haskell). 나는 [Learn You a Haskell] (http://learnyouahaskell.com/)을 즐겼다. – adamse

관련 문제