2016-02-13 10 views
10

Tôi vừa mới bắt đầu tìm hiểu Haskell và tôi đang cố gắng sử dụng mẫu phù hợp để khớp với danh sách có chính xác 2 phần tử. Như một bài tập, tôi đang cố gắng viết một hàm trả về một hàm nhưng phần tử cuối cùng từ một danh sách. Cho đến nay tôi thấy điều này:Danh sách đối sánh mẫu với chính xác 2 phần tử trong Haskell

myButLast :: [a] -> a 
myButLast [] = error "Cannot take one but last from empty list!" 
myButLast [x] = error "Cannot take one but last from list with only one element!" 
myButLast [x:y] = x 
myButLast (x:xs) = myButLast xs 

Bây giờ phù hợp với myButLast [x: y] rõ ràng là không chính xác, nhưng tôi không biết làm thế nào để phù hợp với một danh sách đó có chính xác 2 yếu tố, như đó là những gì tôi m cố gắng làm ở đó. Tôi đọc (http://learnyouahaskell.com/syntax-in-functions#pattern-matching) trang này và nó đã giúp tôi rất nhiều, nhưng tôi không hoàn toàn có được nêu ra ...

+6

Bạn có thể viết '[x, y]' hoặc 'x: y: []'. Cả hai đều tương đương nhau. Mẫu '[x: y]' có nghĩa là "khớp với một danh sách chứa chính xác một phần tử, chính nó là một danh sách, chứa chính xác hai phần tử có tên là' x' và 'y'", không phải là ý của bạn. – MathematicalOrchid

+0

@MathematicalOrchid Oh, tôi hiểu rồi. Cảm ơn nhiều! –

+8

Trên thực tế, không, điều đó sai ... '[x: y]' có nghĩa là 'x' là phần tử đầu tiên và' y' là danh sách con còn lại. (Hãy suy nghĩ '[x: xs]'.) Xin lỗi về điều đó ... Dù bằng cách nào, nó không phải là ý của bạn. – MathematicalOrchid

Trả lời

15
myButLast :: [a] -> a 
myButLast [] = error "empty list" 
myButLast [x] = error "too few elements" 
myButLast [x, _] = x 
myButLast (x: xs) = myButLast xs 

Đây là quesion thứ hai trong 99 questions.

Các vấn đề liên quan