20/09/13 21:12:53.92 Tso/1gLY.net
ふ?何言ってんの
可換モノイドの圏は集合の圏の
[部分圏](URLリンク(ncatlab.org))だが、
集合の圏ではない。したがって、分数モナドは、
Haskellの`Monad`のインスタンスにならない。
例えば、次のような実装を考えると、
``` code
newtype Bunsu a = Bunsu {
runBunsu :: (a, a)
} deriving (Show, Functor)
instance (Eq a, Semigroup a) => Eq (Bunsu a) where ...
instance (Semigroup a) => Semigroup (Bunsu a) where ...
instance (Monoid a) => Monoid (Bunsu a) where ...
instance (Monoid a) => Group (Bunsu a) where ...
bunsu_pure :: (Monoid a) => a -> Bunsu a
bunsu_pure = ...
```
縛り`Monoid a`が邪魔をして、`Bunsu`は`Applicative`のインスタンスに
できない。それでも、通常の関数の形でなら`bunsu_pure`と`bunsu_join`は
書けるので、モナド則のチェックはできる。ただし、`Bunsu`は、
可換モノイドの圏でのモナド則は満たすが、集合の圏でのモナド則は満たさない。
質問への直接の答えは避けるが、可換モノイドの圏で考えないと
答えは得られない。