Bối cảnh: Tôi đang điều tra đệ quy ẩn danh và tôi đang thử thách việc thực hiện khúc dạo đầu mà không sử dụng bất kỳ đệ quy nào được đặt tên chỉ để giúp mọi người ngồi thoải mái trong đầu tôi. Tôi chưa hoàn toàn ở đó, và trên đường đi, tôi đã gặp phải thứ gì đó không liên quan nhưng vẫn thú vị.Các chức năng tương đương tạo ra các kết quả phiên dịch khác nhau
map1 = \f -> \x -> if (tail x) == []
then [f (head x)]
else f (head x) : (map1 f (tail x))
map2 f x = if (tail x) == []
then [f (head x)]
else f (head x) : (map2 f (tail x))
map3 f (x:xs) = if xs == [] then [f x] else f x : (map3 f xs)
map4 f (x:[]) = [f x]
map4 f (x:xs) = f x : map4 f xs
GHC than phiền câu hỏi đầu tiên, tốt với thứ hai và thứ ba và thứ tư là chỉ để cho biết cách chúng có thể được triển khai khác nhau.
*Main> map1 (*2) [1..10]
<interactive>:1:15:
No instance for (Num())
arising from the literal `10'
Possible fix: add an instance declaration for (Num())
In the expression: 10
In the second argument of `map1', namely `[1 .. 10]'
In the expression: map1 (* 2) [1 .. 10]
*Main> map2 (*2) [1..10]
[2,4,6,8,10,12,14,16,18,20]
*Main> map3 (*2) [1..10]
[2,4,6,8,10,12,14,16,18,20]
*Main> map4 (*2) [1..10]
[2,4,6,8,10,12,14,16,18,20]
Nếu tôi thêm chữ ký loại vào bản đồ 1 thì tất cả đều tốt.
map1 :: Eq a => (a -> b) -> [a] -> [b]
Hai hàm đầu tiên có vẻ khá giống với tôi, vì vậy tôi cho rằng câu hỏi của tôi đơn giản là "Có gì đang diễn ra ở đây?"
Tôi không chắc chắn nếu bạn có lý do cụ thể để viết theo cách này. Tại sao bạn không sử dụng [] làm trường hợp cơ sở cho đệ quy thay vì (x: [])? Không có chức năng nào của bạn sẽ hoạt động với danh sách trống. –