Я хотел бы создать тип, который является экземпляром Monad
, так что тип результата может быть только экземпляром определенного c класса типов. Я хотел бы иметь возможность написать что-то вроде
data T a = T a
class C a where
...
instance Monad T where
return :: (C a) => a -> m a
return x = ...
(>>=) :: (C a, C b) => m a -> (a -> m b) -> m b
p >>= f = ...
В реальном коде, над которым я работаю, мне нужно ограничение класса типов для типа результата, чтобы указанная функция c из класса типов доступно в определениях для return
и (>>=)
. Есть ли способ сделать это?