正如您在二进制包的源代码中看到的那样(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
,因为PutM
monad基本上是Writer Builder
(但有一个专门的实现).
至于你的第二个问题,它与第一个问题无关,所以你应该把它作为一个单独的问题.