オレも、Haskell の勉強の一環として『圏論の基礎』を買ったけど、すぐに挫折したくち。

ただ、それでも、以前も書いたことだけど、オレは MonadやArrowのdo記法の存在が、圏論による抽象化の小さくない恩恵だと思っている。
他には、例えば、\x -> fmap f1 $ fmap f2 $ fmap f3 $ x = fmap (f1 . f2 . f3) ということにすぐに気が付き、関数を短く書けるということも、圏論による抽象化の恩恵なんだろう、たぶん。

あと、次のような例を思いついた。モノイドを圏に変換しているんだけど、これは(すぐに挫折した)『圏論の基礎』からの知識を使っている。

import Prelude hiding ((.), id)

import Control.Category
import Data.Monoid

data Monoid m => MonoidCategory m a b = MonoidCategory m

mc :: Monoid m => m -> MonoidCategory m () ()
mc = MonoidCategory

runMC :: Monoid m => MonoidCategory m () () -> m
runMC (MonoidCategory a) = a

instance Monoid m => Category (MonoidCategory m) where
{ id = MonoidCategory mempty
; (MonoidCategory a) . (MonoidCategory b) = MonoidCategory $ a `mappend` b }

foobar = runMC $ (mc "Foo") . id . (mc "Bar")
-- foobar => "FooBar"