Vì vậy, tôi nhận ra đây là một bản sao có thể câu hỏi, vì có một số lỗi được báo cáo trên Stack Overflow, nhưng không có giải pháp nào có vẻ áp dụng cho vấn đề của tôi.Haskell, Mặc dù loại của tôi không được chỉ định Tôi nhận được lỗi này: Không thể khớp loại `a 'với` [a]', `a 'là biến kiểu cứng nhắc bị ràng buộc bởi
Vì vậy, tôi có chức năng sau:
elementAt' :: Integral b => [a] -> b -> a
elementAt' [x:_] 1 = x
elementAt' [x:xs] y = elementAt' xs yminus1
where yminus1 = y - 1
Trong trường hợp bạn đang tự hỏi nó là vấn đề của 3 từ 99 Haskell Problems. Mục tiêu của hàm là lấy đầu vào một danh sách và một chỉ mục, và trả về giá trị tại chỉ mục đó (bắt đầu từ 1). Tôi không muốn một giải pháp cho vấn đề, nếu tôi đã làm tôi chỉ có thể nhìn vào những người được cung cấp. Nhưng tôi nhận được một lỗi mà tôi không hiểu. Tôi đang sử dụng eclipseFP, plugin nhật thực cho Haskell và nó nhấn mạnh "[x: _]" và "[x: xs]" phần của chức năng với các lỗi sau:
Couldn't match type `a' with `[a]'
`a' is a rigid type variable bound by
the type signature for elementAt' :: Integral b => [a] -> b -> a
Trong tất cả các chủ đề thảo luận về lỗi này mà tôi đã xem xét vấn đề thường xảy ra khi ai đó cố gắng đưa ra một kết quả không chính xác cho cái gì đó mong đợi một loại nhất định. Ví dụ, trả về độ dài của một cái gì đó (có kiểu Int) cho loại biến thể "Num a".
Nhưng trong trường hợp của tôi, tôi thậm chí không cung cấp loại cho biến a. Nó sẽ có thể được bất cứ điều gì, phải không? Vậy tại sao tôi nhận được lỗi này? Nếu tôi hiểu tại sao tôi lại gặp lỗi, tôi có thể sửa nó, nhưng tôi không hiểu.
Ai đó có thể giải thích cho tôi lý do tôi nhận được lỗi này?
Trợ giúp của bạn được đánh giá cao, cảm ơn bạn. -Asaf
Chỉnh sửa: Mọi câu trả lời được cung cấp cho đến thời điểm này đều chính xác, cảm ơn tất cả vì thông tin hữu ích. Tôi sẽ chọn cái mà tôi tin là rõ ràng nhất (tôi phải đợi 5 phút để làm điều đó).
lý do tại sao không chỉ viết '' elementAt '[x: xs] y = elementAt' xs (y-1) '' –
@Vixen Điều đó khác với những gì tôi viết ... ngoài việc bao gồm khai báo biến? Rõ ràng trình biên dịch sẽ kết thúc làm điều tương tự chính xác trong cả hai trường hợp (sửa tôi nếu tôi sai). – Asaf
Vâng, nó giống nhau, tôi chỉ nghĩ rằng có vẻ lạ khi tuyên bố một cái gì đó như yminus1, khi y-1 đọc dễ dàng hơn và trông đẹp hơn theo quan điểm của tôi –