Đôi khi bạn muốn gấp một danh sách các bộ dữ liệu thành một bộ bằng các hàm gấp khác nhau. Ví dụ, để dán cùng một danh sách các kết quả runState, nhận được một trạng thái kết hợp (theo một nghĩa nào đó) và kết quả kết hợp.Sử dụng các mũi tên để gấp một danh sách các bộ dữ liệu
Xem xét việc thực hiện sau đây:
wish :: (a -> a' -> a) -> (b -> b' -> b) -> (a,b) -> [(a', b')] -> (a,b)
wish lfn rfn x xs = foldl (\(a,b) -> (lfn a) *** (rfn b)) x xs
Mặc dù nó hoạt động, tôi cảm thấy không thoải mái về lambda này. lfn *** rfn
của chính nó có một loại (a,b) -> (a -> a', b -> b')
, mà tôi không thể tìm thấy một cách để áp dụng đúng cho một bộ túp mà không bao giờ phải dùng đến mẫu phù hợp. Có một cách rõ ràng và thanh lịch tôi đang thiếu? Nó có thể là một chức năng thư viện kiểu (a,a') -> (a -> a, a' -> a') -> (a, a')
hoặc một cách tiếp cận hoàn toàn khác, có thể.
Một số loại lớp BiApplicative sẽ làm .. Có thể là một nơi nào đó trên hackage, nhưng tôi sẽ để nó cho người khác để trang trải cái nào tốt và không được chấp nhận. – Carl
http://squing.blogspot.com/2008/11/beautiful-folding.html và diễn giải của nó trên Hackage, http://hackage.haskell.org/package/ZipFold –