Могу ли я сделать это монадой

У меня есть тип 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, Эти два всегда должны быть равны, но они даже не одного и того же типа.

Другие вопросы по тегам