Tại sao kịch bản lệnh Haskell sau đây không hoạt động như mong đợi?Các biến trong Haskell
find :: Eq a => a -> [(a,b)] -> [b]
find k t = [v | (k,v) <- t]
Với find 'b' [('a',1),('b',2),('c',3),('b',4)]
, người phiên dịch trả [1,2,3,4]
thay vì [2,4]
. Sự ra đời của một biến mới, dưới đây gọi u
, là cần thiết để có được điều này để làm việc:
find :: Eq a => a -> [(a,b)] -> [b]
find k t = [v | (u,v) <- t, k == u]
Có ai biết lý do tại sao phiên bản đầu tiên không tạo ra kết quả mong muốn?
Lặp lại sau tôi: không có biến nào trong Haskell. ;-) Đây là các ký hiệu hoặc số nhận dạng. Các biến có nghĩa là biến đổi. Trong Haskell, mọi thứ đều không thay đổi. –
@Konrad Rudolph: Báo cáo Haskell 98 sử dụng thuật ngữ "biến" trên khắp nơi. Điều quan trọng cần lưu ý rằng điều này không có nghĩa là những gì bạn có thể mong đợi, nhưng tôi không nghĩ là có nhiều sự kiên trì hơn so với tài liệu chuẩn là cần thiết. –
@Konrad Rudolph: Chắc chắn bạn thích thú! Tại sao, tôi đã tìm thấy toàn bộ phần về các biến [trong một số Haskell, ngay tại đây] (http://books.google.com.vn/books?id=27dkTJFrLZIC&pg=PA111). –