mtl并不关心monad堆栈中monad的顺序,只要有可行的实现。例如:
foo :: (MonadError () m, MonadState Int m) => m ()
foo = (put 1 >> throwError ()) `catchError` return
main :: IO ()
main = do
print $ runExcept $ flip execStateT 0 $ foo -- returns Right 0
print $ flip execState 0 $ runExceptT $ foo -- returns 1
假设我想创建一个mini-mtl框架(为简单起见,只覆盖ExceptT
和StateT
),它对组合顺序很敏感,让我表达一些东西像
此功能需要优先于错误的效果 状态效应,但我让你选择确切的错误和状态 的实施方式。
或
此函数需要优先于状态的状态效果 错误效果,但我让你选择确切的错误和状态 的实施方式。
以这种方式只有具有正确顺序的堆栈具有所需的实例。
我不知道如何在类型类约束中嵌入效果优先级。我需要某种Constraint -> Constraint
的“约束变换器”吗?也许某些约束由类型级别的约束参数化?