2017-11-25 3 views
-3

패턴 일치를 사용하여 정의 된 하스켈 함수가 있는데 실제로 어떻게 보이는지 이해할 수 없습니다.safeTail 함수의 Haskell 패턴 일치

safeTail (x : xs) = xs 

(x : xs)을 구체적으로 모르겠다는 것은 무엇을 의미합니까?

+0

을 :

safeTail의 전체 정의는 빈리스트 인수에 대한 값을 제공 할 것이다 'unsafeTail' 또는'dangerousTail'이라는 이름을지었습니다. 왜냐하면 그것은 빈리스트에서 충돌 할 것이기 때문입니다. – chi

+0

빈리스트를위한 catchall을 얻었지만 여기서 중요한 점은 함수가 아니라 (x : xs)의 구문을 이해할 수 있기 때문입니다. – Wandy

답변

1

패턴 일치가 있습니다.

함수의 첫 번째 인수는 safeTail이며 일부 목록 유형입니다. 인수가 비어 있지 않은 목록 인 경우이 패턴 일치가 성공하고 x을 head 요소에 바인딩하고 xs을 목록의 끝에 바인딩합니다.

빈 목록을 safeTail으로 전달하는 경우 패턴 일치가 실패하고 다른 패턴 (있는 경우)이 확인됩니다.

2

목록 데이터 유형에 대해 유사한 정의를 고려하십시오.

data List a = Empty | Cons a (List a) -- (1) 

비어있는 목록을 만드는 방법과 값과 다른 목록이있는 목록을 만드는 방법이 있습니다.

패턴 일치는 값을 생성하는 데 사용 된 생성자와 비교하여 작동합니다. safeTailCons 생성자를 사용하여 정의 된 값에 적용되는 경우이다

safeTail (Cons x xs) = xs -- (2) 

는, 반환 값은 Cons 두 번째 인자이다. 실제 코드에서

, 유형 생성자 ListEmpty 데이터 생성자 모두 [] 명명하고 Cons 생성자는 (:) 지정됩니다. 하스켈 허용

data [] a = [] | (:) a ([] a) 

[] 내부 인수 및 상징적 생성자 (포함 의해 대체 될 수있는 형태 또는 유형 변수 타입 constructer [] 적용 특수 구문

data [a] = [] | a : [a] 

작성 될 :으로 시작하기 때문에) 중위 연산자로 사용할 수 있습니다.

이다

에는 쓸 수

safeTail ((:) x xs) = xs -- (3) 

또는 함께

safeTail (x : xs) = xs -- (4) 

(2), (3), (4)에 해당되고, 상기 (1). 상기 편의상

>>> safeTail ((:) 3 ((:) 2 ((:) 1 []))) 
[2,1] 
>>> safeTail (3:2:1:[]) 
[2,1] 
>>> safeTail [3,2,1] 
[2,1] 

는 하스켈 등 [x,y]뿐만 아니라 (x:y:[])[x](x:[]) 나타낸다즉 함수의 전체 정의가 있다면 나는 것,

safeTail [] = [] 

또는 Maybe 기반 정의

safeTail :: [a] -> Maybe [a] 
safeTail [] = Nothing 
safeTail (x:xs) = Just xs 
+0

'Maybe' 기반 정의는 실제로'safeHead'이며'safeTail'이 아닙니다. – 4castle