我有一个类型T
(如果你感兴趣的话,是我一直在探索的静态指针的包装here)我可以高兴地编写以下操作:
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
都不受限制。
这一切看起来都像monad一样,但唯一的问题是受限制的纯粹。无论如何,也许有一些GADT
包装/解包,我可以使用标准Monad
层次结构吗?
如果没有,是否存在备用层次结构,这会限制pure
但保持<*>
和>>=
不受限制?
另请注意T a
对某些a
仍然有效,即使pure (x :: a)
不是T (b -> a)
,例如将T b
和ap
合并为{{ 1}}。
答案 0 :(得分:0)
由于不符合正确的身份法,它不会像单身一样工作。
bindT m pureT
的类型为C a => T a
,而m
的类型为T a
。这两个应该总是相等,但这些甚至不是同一类型。