>>985
関数に関数を直接渡すと型の制約が厳しくなる場合がある
なので直接渡さないために型クラスを使う
動的型ではそういうことが起きないので型クラスは不要

f :: (a -> b -> a) -> b -> b -> a -> a -- 制約が強すぎる
f op g h m = (m `op` g) `op` h

f' :: Monad a => (b -> a b) -> (b -> a b) -> a b -> a b -- 制約が強すぎる
f'= f (>>=)

f'' :: Monad a => (b -> a c) -> (c -> a d) -> a b -> a d
f'' g h m = (m >>= g) >>= h