haskell – Put的MonadFix实例

一个简单的问题,我希望:二进制包定义了两种类型, Get and Put.前者本质上是一个状态monad,后者本质上是一个writer.州和作家都有合理的MonadFix实例,所以我希望Get和Put也会这样.

得到了. Put没有.那么,是否可以为Put定义一个合适的MonadFix实例(真的是PutM)?

一个更普遍的问题是:通常如何验证类型类实例是否真正满足该类型类的规律?

正如您在二进制包( Data.Binary.Put:71)的源代码中所看到的,构建器中用于monadic值的数据结构是严格的.由于从monad中提取值必须强制找到值的结构,如果构建器依赖于输入,这将导致无限循环.

data PairS a = PairS a !Builder
newtype PutM a = Put { unPut :: PairS a }

所以你可以编写一个MonadFix实例,但是你无法用它做任何有用的事情.但是我认为你无论如何都不能对MonadFix做任何有用的事情,至少没有你用普通的旧修复做的事情,因为PutM monad基本上是Writer Builder(但是有专门的实现).

至于你的第二个问题,它与第一个问题无关,所以你应该把它作为一个单独的问题.

相关文章
相关标签/搜索