Backwards是否承认Monad实例?

dfe*_*uer 7 monads haskell

我刚刚在haskell-cafe上问这个,但我想我也可以在这里问一下.以下Monad实例是否Backwards m有效?

{-# Language RecursiveDo #-}

import Control.Applicative.Backwards
import Control.Monad.Fix

instance MonadFix m => Monad (Backwards m) where
  m >>= f = Backwards $
    do
      fin <- forwards (f int)
      int <- forwards m
      pure fin
Run Code Online (Sandbox Code Playgroud)

如果是这样,我还可以添加吗?

instance MonadFix m => MonadFix (Backwards m) where
  mfix f = Backwards $ mfix (forwards . f)
Run Code Online (Sandbox Code Playgroud)

Pet*_*lák 2

因为这f需要惰性,也就是说,效果不能依赖于参数。文档说

mfix f仅执行该操作f一次,最终输出作为输入反馈。因此f不应该严格,因为那样mfix f就会发散。

Buf 如果f在你的情况下m >>= f是严格的,那么传递给 的块也将是严格的mfix

让我们考虑一个实际的例子,其中mreadLine >>= putStrLn。颠倒顺序意味着“打印数据,然后读取它”。除非后面函数的效果>>=不依赖于输入,否则就会出现分歧。

  • 我听说 GHC 8.0 将支持“IO”的时间旅行。 (2认同)