因此,现实世界Haskell说:



但是我正在与Scotty一起玩,发现它的基本monad转换器ScottyT不是MonadTrans的实例。

查看发行说明,似乎这是一个经过深思熟虑的设计决策:here。引用:



希望您能理解我的困惑。不过,我将尝试提出严格的问题:

  • 为什么不希望monad转换器成为MonadTrans的实例?
  • 您将如何解释ScottyT设计中的上述更改?

  • 附注:我确实知道我可以自己定义MonadTrans ScottyT的实例,但我应该吗? (链接回问题)

    最佳答案

    ScottyT不是monad转换器。让我们内联(简化)定义:

    newtype ScottyT' m a = ScottyT' {
       runS :: State [ (Request->m Response) -> Request->m Response ] a
      }
    

    要为此定义lift,您需要从常规m a操作和此类中间件列表中获取实际的a值,因为State s会产生实际的非单调值。无法做到这一点。

    现在,如果您争辩说某物成为monad转换器实际上并不需要MonadTrans:从数学上讲,monad转换器对应于仿函数的组合,但是ScottyT实际上并未实现这种组合。

    关于haskell - 将每个monad转换器作为MonadTrans的实例真的是默认做法吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32854747/

    10-10 07:55