Thuộc tính gấp có nghĩa là nó là một hàm đệ quy danh sách, tương đương với tất cả các hàm đệ quy danh sách khác, miễn là bạn cung cấp cho nó các tham số đúng.
Thuộc tính này có thuộc tính này bởi vì nó chấp nhận làm tham số, các chức năng sẽ được áp dụng cho các mục trong danh sách.
Ví dụ, nếu chúng ta viết một hàm sum đơn giản:
sum [] = 0
sum (head:tail) = head + (sum tail)
sau đó chúng tôi thực sự có thể viết nó như là một chức năng lần thay vào đó, bằng cách thông qua trong (+) điều hành mà chúng tôi muốn sử dụng để kết hợp các mặt hàng:
sum list = foldl (+) 0 list
Vì vậy, bất kỳ chức năng nào hoạt động đơn giản và đệ quy trên danh sách đều có thể được viết lại dưới dạng hàm gấp. Tương đương đó là tài sản mà nó nắm giữ. Tôi tin rằng anh ta gọi đặc tính phổ quát, bởi vì nó hoạt động trên tất cả các thuật toán danh sách tuyến tính đệ quy này, mà không có ngoại lệ. Và như ông giải thích, lý do tài sản này rất hữu ích, là bởi vì chúng tôi có thể hiển thị tất cả các thuật toán khác thực sự tương đương với gấp, bằng cách chứng minh điều gì đó về nếp gấp, chúng tôi cũng chứng minh nó cho tất cả các thuật toán khác.
cá nhân tôi thấy các chức năng lần khó hiểu, vì vậy đôi khi tôi đã sử dụng của riêng tôi mà trông như thế này:
-- forall - A kind of for next loop
-- list is list of things to loop through
-- f is function to perform on each thing
-- c is the function which combines the results of f
-- e is the thing to combine to when the end of the list is reached
forall :: [a] -> (a->b) -> (b->b->b) -> b -> b
forall [] f c e = e
forall (x:xs) f c e = c (f x) (forall xs f c e)
(Đây thực sự là một chút mạnh mẽ hơn foldl vì nó có tính năng bổ sung của việc áp dụng chức năng f cho từng mục trong danh sách.)
Không ai chứng minh được gì về chức năng của tôi. Nhưng điều đó không quan trọng, bởi vì tôi có thể chỉ ra rằng chức năng của tôi thực sự là một hàm gấp:
forall l f c e = foldl c e (map fn l)
Và vì thế tất cả những thứ đã được chứng minh về nếp gấp, cũng được chứng minh là đúng cho chức năng của tôi, và tất cả các công dụng của nó trong suốt chương trình của tôi. (Lưu ý chúng tôi thậm chí không cần xem xét loại chức năng c nào được cung cấp trong mỗi cuộc gọi khác nhau đến forall và foldl, không quan trọng!)
4 năm kể từ khi tôi hỏi, và tối nay tôi đã xem một bài viết nói về điều này.Tôi không biết nếu nó sẽ trả lời đầy đủ câu hỏi của tôi, nhưng nó chắc chắn là có liên quan. Tìm kiếm url này cho "thuộc tính phổ quát": http://jeremykun.com/2013/04/16/categories-whats-the-point/ –
Funnily, bốn năm trước, tôi cũng không biết tài sản chung là gì. Bây giờ tôi đang viết hàng loạt bài đăng trên blog. Thật là một sự trùng hợp ngẫu nhiên mà tôi gặp phải trong khi viết một bài chi tiết hơn về các thuộc tính phổ quát. Nên được thực hiện trong tuần tới. – JeremyKun
@Bean, rất vui khi được nghe! Tôi sẽ rất mong được đọc nó. Bởi vì mặc dù tôi bắt đầu có một câu mực, tôi vẫn là một * dài * cách để có thể yêu cầu tôi hiểu sâu sắc về một tài sản phổ quát là gì. –