Put的MonadFix实例

mer*_*ict 6 haskell typeclass monadfix

一个简单的问题,我希望:binary包定义了两种类型,GetPut.前者本质上是一个州的monad,而后者本质上是一个作家.这两个国家和作家有合理的MonadFix情况下,所以我期待GetPut也.

Get确实.Put没有.那么,是否可以MonadFixPut(真的PutM)定义一个合适的实例?

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

Die*_*Epp 7

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

data PairS a = PairS a !Builder
newtype PutM a = Put { unPut :: PairS a }
Run Code Online (Sandbox Code Playgroud)

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

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