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
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.
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
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ố.
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.
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 '.
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.
- 1. ký hiệu tóm tắt trang người đàn ông
- 2. 'Tóm tắt' trong Latex
- 3. Bản ghi Git - tóm tắt tóm tắt của chi nhánh
- 4. Tóm tắt constructor trong C#
- 5. Trích xuất hiệu ứng Ngẫu nhiên từ tóm tắt nlme
- 6. Deserialize Tóm tắt Lớp
- 7. Các chuỗi ký hiệu hiệu quả trong Haskell
- 8. Phím tắt hoàn thành mã tóm tắt
- 9. Trường tóm tắt PreferenceCategory thẻ
- 10. Twitter "Xem tóm tắt" nút
- 11. PreferenceActivity cập nhật tóm tắt
- 12. Tạo bảng tóm tắt ("trục"?)
- 13. WiX, Windows Installer tóm tắt?
- 14. Chuỗi Xml trong nhận xét tóm tắt C#
- 15. Visual Studio XML comments (tóm tắt) và ký tự đặc biệt
- 16. ddply tóm tắt hoạt động chuỗi
- 17. Sử dụng chính xác lớp Tóm tắt
- 18. tắt ký hiệu khoa học trong Gson serialization đôi
- 19. Ký hiệu byte viết tắt trong C/C++?
- 20. Tóm tắt Blog Orchard Văn bản
- 21. Visual studio tóm tắt thông số Intellisense
- 22. Tóm tắt Bài viết trên Wikipedia
- 23. RMagic, IPython và Tóm tắt Thông tin
- 24. Bản tóm tắt địa chỉ của WinDbg
- 25. nhóm theo dữ liệu tóm tắt
- 26. Ký hiệu ghi chú Haskell để liên kết
- 27. Python nhóm bằng mảng một, và tóm tắt mảng b - Hiệu suất
- 28. Mô tả NSObject và tóm tắt tùy chỉnh trong Xcode
- 29. Xem Tóm tắt Xác thực trong bộ điều khiển
- 30. Tóm tắt các loại/Loại Các tham số trong Scala
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'. –