2012-09-05 27 views
6

Tài liệu dành cho algebra/2.1.1.2/doc/html cho thấy số lượng loại lớp khổng lồ.Monoid giao hoán từ gói 'đại số' trên Hackage

Làm cách nào để tuyên bố rằng cấu trúc được đề cập phải được trang bị hoạt động liên kết giao hoán và phần tử đơn vị/nhận dạng, nhưng không có bất kỳ thứ gì khác (inverses, distributivity etc)?

Tôi đang nghĩ đến việc

reduce :: Monoid m => (a -> m) -> [a] -> m 

nhưng trường hợp của Data.Monoid không nghĩa vụ phải được hoán và tôi muốn người dùng chức năng của tôi để thấy rằng họ cần hoán cho các chức năng để làm việc bằng cách nhìn vào kiểu.

Trả lời

8

(Abelian m, Monoidal m)

Nó có vẻ như rằng Monoidal là nhiều hơn bạn muốn, nhưng tất cả đều dựa trên Natural là một Semiring.

+1

Đây là câu trả lời đúng. –

1

Dường như gói cung cấp một lớp giao hoán, vì vậy chính xác cho tôi nếu tôi là sai, nhưng có vẻ như nó chỉ là một vấn đề xác định một typeclass thứ hai:

reduce :: (Monoid m, Commutative m) => (a -> m) -> [a] -> m 
+0

'Giao hoán 'nói về hành động của lớp' Phép nhân ', không phải là' Monoid'. Bạn có thể sử dụng '(Commutative m, Unital m)' để có được một monoid giao hoán nhân, hoạt động với '(*)' và 'one', hoặc' (Abelian m, Monoidal m) 'để có được một monoid giao hoán hoạt động với' (+) 'và' không'. –

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