Ищу конструктивную критику по реализации монад

Я изучаю монады, это моя первая рабочая монада (не считая тривиальной монады). Смело критикуйте все в нем безжалостно. Меня особенно интересуют «более идиоматические» и «более элегантные» ответы.

Эта монада подсчитывает количество выполненных связываний.

data C a = C {value :: a, count :: Int} deriving (Show)

instance Monad C where
    (>>=) (C x c) f = C (value $ f x) (c + 1)
    return x = C x 0

add :: (Num a) => a -> a -> C a
add x y = return $ x + y

-- Simpler way to do this? foldM is obviously something different.
mysum [x] = return x
mysum (x:xs) = mysum xs >>= add x
33
задан luqui 6 February 2012 в 23:50
поделиться