패턴 일치를 사용하여 정의 된 하스켈 함수가 있는데 실제로 어떻게 보이는지 이해할 수 없습니다.safeTail 함수의 Haskell 패턴 일치
safeTail (x : xs) = xs
(x : xs)을 구체적으로 모르겠다는 것은 무엇을 의미합니까?
패턴 일치를 사용하여 정의 된 하스켈 함수가 있는데 실제로 어떻게 보이는지 이해할 수 없습니다.safeTail 함수의 Haskell 패턴 일치
safeTail (x : xs) = xs
(x : xs)을 구체적으로 모르겠다는 것은 무엇을 의미합니까?
패턴 일치가 있습니다.
함수의 첫 번째 인수는 safeTail
이며 일부 목록 유형입니다. 인수가 비어 있지 않은 목록 인 경우이 패턴 일치가 성공하고 x
을 head 요소에 바인딩하고 xs
을 목록의 끝에 바인딩합니다.
빈 목록을 safeTail
으로 전달하는 경우 패턴 일치가 실패하고 다른 패턴 (있는 경우)이 확인됩니다.
목록 데이터 유형에 대해 유사한 정의를 고려하십시오.
data List a = Empty | Cons a (List a) -- (1)
비어있는 목록을 만드는 방법과 값과 다른 목록이있는 목록을 만드는 방법이 있습니다.
패턴 일치는 값을 생성하는 데 사용 된 생성자와 비교하여 작동합니다. safeTail
가 Cons
생성자를 사용하여 정의 된 값에 적용되는 경우이다
safeTail (Cons x xs) = xs -- (2)
는, 반환 값은 Cons
두 번째 인자이다. 실제 코드에서
, 유형 생성자 List
과 Empty
데이터 생성자 모두 []
명명하고 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
'Maybe' 기반 정의는 실제로'safeHead'이며'safeTail'이 아닙니다. – 4castle
을 :
safeTail
의 전체 정의는 빈리스트 인수에 대한 값을 제공 할 것이다 'unsafeTail' 또는'dangerousTail'이라는 이름을지었습니다. 왜냐하면 그것은 빈리스트에서 충돌 할 것이기 때문입니다. – chi빈리스트를위한 catchall을 얻었지만 여기서 중요한 점은 함수가 아니라 (x : xs)의 구문을 이해할 수 있기 때문입니다. – Wandy