Могу ли я сделать это монадой
У меня есть тип T
(который, если вам интересно, является оберткой статических указателей, которые я изучал здесь), где я могу с радостью написать следующие операции для:
unpointT :: T a -> a
apT :: T (a -> b) -> T a -> T b
bindT :: T a -> (a -> T b) -> T b
Проблема в том, что у меня нет неограниченных pure
функция. pure
должно быть ограничено в моем случае некоторым ограничением, которое говорит, что тип является сериализуемым, таким как Binary
,
pureT :: C a => a -> T a
Обратите внимание, что оба apT
а также bindT
не ограничены.
Все это выглядит довольно монадоподобно, но единственной проблемой является ограниченная чистота. Есть ли в любом случае, возможно, с некоторыми GADT
завернуть / развернуть, что я могу заставить это работать со стандартом Monad
иерархия?
Если нет, существует ли альтернативная иерархия, которая ограничивает pure
но держит <*>
а также >>=
без ограничений?
Обратите внимание, что T a
все еще может быть действительным для некоторых a
даже если pure (x :: a)
нет, например, путем объединения T (b -> a)
а также T b
с ap
,
1 ответ
Он не будет работать, как монада, так как правильный закон о личности не выполняется.
bindT m pureT
имеет тип C a => T a
в то время как m
имеет тип T a
, Эти два всегда должны быть равны, но они даже не одного и того же типа.