2009-08-27 35 views
6

Trên trang Wikipedia về summation nó nói rằng hoạt động tương đương trong Haskell là sử dụng foldl. Câu hỏi của tôi là: Có bất kỳ lý do nào khiến nó sử dụng thay vì tổng số không? Liệu có phải một người 'thuần khiết' hơn người kia, hay không có khác biệt thực sự?Ký hiệu tóm tắt trong Haskell

Trả lời

11

foldl là chức năng giảm chung tail-recursive. Đệ quy là cách thông thường để suy nghĩ về thao tác danh sách các mục trong một ngôn ngữ lập trình hàm, và cung cấp một sự thay thế cho lặp lặp lại thường thanh lịch hơn nhiều. Trong trường hợp chức năng giảm như fold, việc triển khai đệ quy đuôi is very efficient. Như những người khác đã giải thích, sum là sau đó chỉ là một cách thuận tiện ghi nhớ cho foldl (+) 0 l.

Có lẽ việc sử dụng nó trên trang wikipedia là minh họa nguyên tắc tổng quát chung thông qua đệ quy đuôi. Nhưng vì thư viện Haskell Prelude chứa sum, ngắn hơn và rõ ràng hơn để hiểu, bạn nên sử dụng nó trong mã của bạn.

Đây là một nice discussion trong số các chức năng fold của Haskell với các ví dụ đơn giản đáng để đọc.

3

Tôi không thấy nó nói gì về Haskell hoặc foldl trên trang Wikipedia đó, nhưng sum trong Haskell chỉ là trường hợp cụ thể hơn là foldl. Nó có thể được thực hiện như thế này, ví dụ:

sum l = foldl (+) 0 l 

Mà có thể được giảm xuống còn:

sum = foldl (+) 0 
+0

Aah, giờ tôi đã thấy. Tôi đã thực hiện tìm kiếm 'foldl' nhưng trang Wikipedia sử dụng 'fold'. –

0

Không có sự khác biệt. Trang đó chỉ đơn giản nói rằng sum được triển khai bằng cách sử dụng foldl. Chỉ cần sử dụng sum bất cứ khi nào bạn cần tính tổng của một danh sách các số.

1

Như đã nêu bởi những người khác, không có sự khác biệt. Tuy nhiên, một cuộc gọi tổng hợp dễ đọc hơn một cuộc gọi gấp, vì vậy tôi sẽ tổng hợp nếu bạn cần tổng kết.

2

Một điều cần lưu ý là tổng có thể lười hơn bạn muốn, vì vậy hãy cân nhắc sử dụng foldl '.

0

Khái niệm tóm tắt có thể được mở rộng thành các loại không phải là số: tất cả những gì bạn cần là một thứ tương đương với thao tác (+) và giá trị bằng không. Nói cách khác, bạn cần một số monoid. Điều này dẫn đến hàm Haskell "mconcat", trả về tổng của một danh sách các giá trị của một loại monoid. Mặc định "mconcat" tất nhiên được định nghĩa theo "mappend", đó là thao tác cộng.