algebra/2.1.1.2/doc/htmlのドキュメントには、膨大な数の型クラスが示されています。
問題の構造に可換結合操作と単位/単位要素が必要であるが、他に何も (逆数、分配性など) がないと宣言するにはどうすればよいですか?
考えている
reduce :: Monoid m => (a -> m) -> [a] -> m
しかし、Data.Monoid のインスタンスは交換可能であるとは想定されていません。関数のユーザーには、型を見て、関数が機能するために交換可能性が必要であることを理解してもらいたいと思います。