나는 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 배정되지 않았습니다. 클래스의 물건보다 앞서서의 마일
빈리스트는 머리와 꼬리를 가지고 있지 않습니다. 존재하지 않는 것을 돌려 줄 수는 없습니다. –
@ AndrásKovács 이것은 agda에서 이와 같은 함수를 작성하지 않는다는 것을 의미합니까? 목록을 반환하는 것 외에 다른 방법이 있습니까? Agda에서 – danny
은 기능의 유형을 문자 그대로 취해야합니다. 'A -> B' 함수는 각각의 A에 대해'B'를 리턴하고 결코 반복하지 않으며, 결코 예외를 throw하지 않으며,'B'를 리턴하는 것 이외의 일은 결코하지 않습니다. 유형에 구현이 없다면 형식을 변경해야합니다. 이 경우에는'head : {A : Set} -> list A -> Maybe A'가 될 수도 있고 비어 있지 않은 vector에'head'와'tail'을 지원하는'Data.Vec'의'Vec'을 사용할 수도 있습니다. –