Transform
- не ограниченная монада.
Посмотрите на Set
. Set
является монадическим в одном аргументе, за исключением того, что аргумент должен быть Ord
. То есть Set
- это монада в подкатегории Hask, где все объекты находятся в Ord
.
Но Transform
это не монада во-первых. Transform :: (* -> *) -> * -> * -> *
, но Monad
относится к вещам типа * -> *
(если вы собираетесь стать теоретиком полной категории, монады в целом являются эндофункторами и примерно должны иметь вид k -> k
для некоторых k
, но Transform
не очень подходит для этого более широкого шаблона). Монада - это Transform m a
, когда m
- это монада. Transform m a
является монадой на всем Hask, если m
также является монадой. Вы видите разницу? Transform m a
данный Monad m
действует на все типы, которые есть. Но я ничего не могу вставить в пробел, чтобы "Set
, учитывая, что ___ работает с каждым существующим типом", потому что ограничение распространяется на параметр, в котором Set
является монадическим, в то время как Transform m a
не имеет ограничение на тип, в котором оно монадическое, но на один из типов, который его составляет.