2009-05-08 23 views
15

Tôi đang làm việc thông qua "Real World Haskell", dẫn đến một tệp PDF miễn phí có tên là "A tutorial on the universality and expressiveness of fold". Nó làm cho điểm mà một "nếp gấp" là "phổ quát". Tôi đang đấu vật với định nghĩa "phổ quát" của mình, và muốn nghe từ những người đã đầu tư thời gian để tiêu hóa nó: Hãy giải thích bằng tiếng Anh đơn giản, khó hiểu nhất, "tài sản phổ quát của nếp gấp"? "Thuộc tính phổ quát" này là gì và tại sao lại quan trọng?Vui lòng giải thích bằng tiếng Anh đơn giản nhất, không có biệt ngữ nhất có thể, "tài sản phổ quát của nếp gấp"?

Cảm ơn.

+2

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/ –

+1

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

+0

@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ì. –

Trả lời

15

(Chế độ biệt ngữ tắt :-)

Thuộc tính chung chỉ là cách chứng minh hai biểu thức bằng nhau. (Đó là những gì có nghĩa là các thuật ngữ "chứng minh nguyên tắc".) Thuộc tính phổ quát nói rằng nếu bạn có thể chứng minh hai phương trình này

g []  = v 
g (x:xs) = f x (g xs) 

sau đó bạn có thể kết luận phương trình thêm

g = fold f v 

Trò chuyện cũng đúng, nhưng đó là tầm thường để chỉ hiển thị bằng cách mở rộng định nghĩa của fold. Các tài sản phổ quát là một tài sản sâu hơn nhiều (đó là một cách biệt ngữ nói rằng nó ít rõ ràng lý do tại sao nó là sự thật.)

Lý do nó là thú vị để làm điều này ở tất cả là nó cho phép bạn tránh bằng chứng bằng cảm ứng, đó là hầu như luôn luôn đáng để tránh.

+0

Cũng có một khái niệm trong bài báo, một cái gì đó dọc theo dòng, "Chỉ có một cách để gấp từ bên phải và áp dụng một chức năng. Đó là một cách là foldr. Nếu bạn có một số phương pháp khác bạn nghĩ là khác nhau, nhìn gần hơn và bạn sẽ thấy rằng nó không khác biệt, bởi vì chỉ có một cách tồn tại. " Ít nhất, đó là những gì tôi nghĩ rằng tôi đọc :). Tôi cần thêm một vài lần đọc lại. Là những gì tôi đã nói đúng hay trong sân chơi bóng chày? Và nếu vậy, làm thế nào điều này liên quan đến tài sản phổ quát? Cảm ơn. –

+0

Charlie, tôi không nghĩ tôi đã rên phần giấy đó. –

+1

Charlie, tôi nghĩ điều đó đúng, đúng vậy. Các tài sản phổ quát là tốt đẹp ở chỗ nó cho phép bạn viết lại các loại thích hợp của định nghĩa đệ quy về mặt gấp. –

8

giấy xác định hai thuộc tính:

g []  = v 
g (x : xs) = f x (g xs) 

và sau đó nói rằng fold không chỉ một hàm thỏa mãn các thuộc tính, nhưng là chỉ chức năng thỏa mãn những tài sản. rằng nó là duy nhất trong vấn đề đó là những gì làm cho nó 'phổ quát' theo nghĩa mà bài báo đang sử dụng.

6

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!)

+3

forall l f c e = foldr (c. F) e l – Tirpen

4

Tôi vừa tìm thấy mục nhập mới (đối với tôi) trên Wikipedia, " Universal Property ". Nó làm sáng tỏ một TÔN của ánh sáng về câu hỏi này. Here's the link: Từ đó, tôi (tenatively) kết luận như sau:

  1. Mặc dù bạn có thể nghĩ đến 100 cách khác nhau để đi bộ qua một danh sách, tính toán trên đường đi, và sản xuất một giá trị cuối cùng trong danh sách, tất cả 100 những cách đó là isomorphic (có nghĩa là cuối cùng, chúng giống nhau). Thực sự chỉ có một cách để giảm một danh sách thành một giá trị, và đó là FOLD.
  2. Fold cũng là "giải pháp hiệu quả nhất" để giảm danh sách thành một giá trị duy nhất. Hoặc bạn có thể nói, giải pháp "yếu tố" hoặc "đơn giản nhất" nhất.

Cùng với nhau, có vẻ như, 2 điểm đó nắm bắt được ý nghĩa của thuật ngữ "tài sản chung".

2

Mặc dù có thể hơi khó theo dõi mà không đọc các bài viết trước trong chuỗi giải thích các thuộc tính phổ quát từ quan điểm phân loại, bài này đưa ra giải thích chi tiết về thuộc tính chung của nếp gấp, cũng như bản đồ và bộ lọc.

http://jeremykun.com/2013/09/30/the-universal-properties-of-map-fold-and-filter/

Mặc dù tôi vẫn chưa viết nó, followup sẽ khái quát này (và làm cho nó đơn giản hơn nhiều để hiểu, mặc dù trừu tượng hơn) để "gấp giống như" hoạt động trên cấu trúc dữ liệu chung.

Xem bài này để biết thêm về những gì thuộc tính phổ quát là: http://jeremykun.com/2013/05/24/universal-properties/

Và vào đây để liên kết đến tất cả các bài viết trong loạt bài này: http://jeremykun.com/main-content/

Thật ra, câu trả lời chấp nhận hiện nay là cách dễ nhất để hiểu những gì thuộc tính phổ quát nói về nếp gấp. Các bài báo được liên kết ở trên chỉ đơn giản là đưa ra một mô tả kỹ thuật chi tiết hơn thông qua lý thuyết danh mục không có trong bài báo được đề cập đến. Tuy nhiên, tôi không đồng ý với tuyên bố trong câu trả lời được chấp nhận, rằng tài sản phổ quát là một tài sản sâu hơn nhiều so với tuyên bố không có biệt ngữ. Thuộc tính phổ quát của nếp gấp là chính xác cùng một tuyên bố, chỉ đóng hộp thành ngôn ngữ của các đối tượng ban đầu và cuối cùng theo bản chất phân tích mọi thứ với lý thuyết thể loại. Phân tích này có giá trị chính xác vì sự tổng quát tự nhiên của nó.

Các vấn đề liên quan