因此,现实世界Haskell说:
但是我正在与Scotty一起玩,发现它的基本monad转换器ScottyT
不是MonadTrans
的实例。
查看发行说明,似乎这是一个经过深思熟虑的设计决策:here。引用:
希望您能理解我的困惑。不过,我将尝试提出严格的问题:
MonadTrans
的实例? 附注:我确实知道我可以自己定义
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/