Vấn đề - giống như nhiều người khác khi bạn đang học Haskell - là một trong những cách gõ. Gõ như sau vào GHCi
:t mylast
và bạn sẽ thấy rằng chữ ký kiểu là
mylast :: [[a]] -> [a]
mà hy vọng một danh sách liệt kê và sẽ trả về một danh sách. Vì vậy, nếu bạn đặt trong một danh sách các chuỗi ["bob", "hàng rào", "nhà"] chức năng sẽ hoạt động như bạn đã viết nó.
Vấn đề là trường hợp cơ sở của bạn: mylast [] = [], cho trình biên dịch biết bạn muốn trả về một danh sách. Bạn muốn trả lại một phần tử, không phải danh sách. Nhưng không có phần tử rỗng trong Haskell (rất nhiều theo thiết kế), vì vậy bạn cần phải sử dụng đơn nguyên Có lẽ.
mylast :: [a] -> Maybe a
mylast [] = Nothing
mylast (x:[]) = Just x
mylast (x:xs) = mylast xs
Monads là một chủ đề khá trừu tượng, nhưng bạn cần có thể là đơn nguyên khi bạn bắt đầu. Tất cả những gì bạn cần biết về nó là nó là một kiểu khai báo để cho trình biên dịch mong đợi hai khả năng: "Không có gì" hoặc "Chỉ x". Mã trả về có thể lấy x và chạy với nó, nhưng nếu bạn bỏ qua "Chỉ", trình biên dịch sẽ phàn nàn.
Cách khác là để ném ra một lỗi khi một danh sách trống đang gặp phải, như vậy:
mynextlast [] = error "no empty lists allowed"
mynextlast (x:[]) = x
mynextlast (x:xs) = mynextlast xs
Nhưng sự nghi ngờ của tôi là Có lẽ là con đường để đi.
Bạn nên chấp nhận câu trả lời rtperson ... – yeyeyerman