我有一个类型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)
请注意这两个apT和bindT不受限制.
这一切看起来都像monad一样,但唯一的问题是受限制的纯粹.无论如何,也许有一些GADT包装/解包,我可以使用标准Monad层次结构吗?
如果没有,是否有存在的替换层级,即限制pure但保持<*>和>>=无限制?
还要注意,即使不是,也T a可以对某些人有效,例如通过组合和使用.apure (x :: a)T (b -> a)T bap