我可以把它变成Monad吗?

时间:2018-04-07 02:01:41

标签: haskell gadt

我有一个类型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

请注意,apTbindT都不受限制。

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

如果没有,是否存在备用层次结构,这会限制pure但保持<*>>>=不受限制?

另请注意T a对某些a仍然有效,即使pure (x :: a)不是T (b -> a),例如将T bap合并为{{ 1}}。

1 个答案:

答案 0 :(得分:0)

由于不符合正确的身份法,它不会像单身一样工作。

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