我可以把它变成Monad吗?

Cli*_*ton 5 haskell gadt

我有一个类型T(如果你感兴趣,是我在这里一直在探索的静态指针的包装器),我可以愉快地编写以下操作:

unpointT :: T a -> a
apT :: T (a -> b) -> T a -> T b
bindT :: T a -> (a -> T b) -> T b
Run Code Online (Sandbox Code Playgroud)

问题是,我没有不受限制的pure功能.pure必须受到我的约束,一些约束表明类型是可序列化的,例如Binary.

pureT :: C a => a -> T a
Run Code Online (Sandbox Code Playgroud)

请注意这两个apTbindT不受限制.

这一切看起来都像monad一样,但唯一的问题是受限制的纯粹.无论如何,也许有一些GADT包装/解包,我可以使用标准Monad层次结构吗?

如果没有,是否有存在的替换层级,即限制pure但保持<*>>>=无限制?

还要注意,即使不是,也T a可以对某些人有效,例如通过组合和使用.apure (x :: a)T (b -> a)T bap

mad*_*gen 0

它不会像单子一样工作,因为不满足正确的身份法则。

bindT m pureT有类型C a => T a,而m有类型T a。这两者应该总是相等的,但它们甚至不是同一类型。