2017-02-16 4 views
1

나는 agda를 배우고 더 나은 이해를 얻기 위해 목록에 연습하고있다. 지금은 목록에 함수를 작성하려고합니다. 빈 목록의 머리와 꼬리를 반환하는 방법에 대해 혼란 스럽습니다.Agda : 빈 목록의 머리와 꼬리를 되 돌린다

data list (A : Set) : Set where 
[] : list A 
_∷_ : A → list A → list A 

Null : {A : Set} → (list A) → Bool 
Null [] = true 
Null (x ∷ a) = false 

tail : {A : Set} → (list A) → A 
tail [] = {!!} 
tail (x ∷ []) = x 
tail (x ∷ a) = tail a 

head : {A : Set} → (list A) → A 
head [] = {!!} 
head (x ∷ a) = x 

내가 첫 번째와 마지막 멤버를 포함하는 목록을 반환하는 대신 첫 번째와 마지막 멤버를 반환하는 다음과 같은 것이 었습니다 발견 주위에 작업 : 여기 내 코드입니다

tail : {A : Set} → (list A) → (list A) 
tail [] = [] 
tail (x ∷ []) = x ∷ [] 
tail (x ∷ a) = tail a 

head : {A : Set} → (list A) → (list A) 
head [] = [] 
head (x ∷ a) = (x ∷ []) 

그러나 머리와 꼬리 값을 반환하는 방법에 대해서는 여전히 혼란 스럽습니다. 어떻게해야합니까?

P.S 배정되지 않았습니다. 클래스의 물건보다 앞서서의 마일

+1

빈리스트는 머리와 꼬리를 가지고 있지 않습니다. 존재하지 않는 것을 돌려 줄 수는 없습니다. –

+0

@ AndrásKovács 이것은 agda에서 이와 같은 함수를 작성하지 않는다는 것을 의미합니까? 목록을 반환하는 것 외에 다른 방법이 있습니까? Agda에서 – danny

+3

은 기능의 유형을 문자 그대로 취해야합니다. 'A -> B' 함수는 각각의 A에 대해'B'를 리턴하고 결코 반복하지 않으며, 결코 예외를 throw하지 않으며,'B'를 리턴하는 것 이외의 일은 결코하지 않습니다. 유형에 구현이 없다면 형식을 변경해야합니다. 이 경우에는'head : {A : Set} -> list A -> Maybe A'가 될 수도 있고 비어 있지 않은 vector에'head'와'tail'을 지원하는'Data.Vec'의'Vec'을 사용할 수도 있습니다. –

답변

3

Agda에서 함수는 총계입니다 : head : {A : Set} -> list A -> A 인 경우 모든 목록에 대해 정의해야합니다. 그러나 head []을 위해 당신은 어떤 임의의 유형 A을위한 요소 (head ([] : list Void) 상상 ...)

문제는 그 head 약속의 당신의 유형 너무 많이를 연상 할 수 없습니다. 사실, 어떤 목록의 첫 번째 요소를 반환 할 수는 없습니다. 비어 있지 않은 목록에 대해서만이 작업을 수행 할 수 있습니다. 그래서 당신은에 head을 변경하거나 비 emptinessseparate proof을, 또는 인수로 non-empty list를 취할 필요가 :

module SeparateProof where 
    open import Data.List 
    open import Data.Bool 
    open import Data.Unit 

    head : {A : Set} → (xs : List A) → {{nonEmpty : T (not (null xs))}} → A 
    head [] {{nonEmpty =()}} -- There's no way to pass a proof of non-emptiness for an empty list! 
    head (x ∷ xs) = x 

module NonEmptyType where 
    open import Data.List.NonEmpty hiding (head) 

    head : {A : Set} → List⁺ A → A 
    head (x ∷ xs) = x -- This is the only pattern matching a List⁺ A!