如何编写一个对monad组合顺序敏感的类似mtl的框架?

时间:2017-05-14 14:13:22

标签: haskell monad-transformers

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框架(为简单起见,只覆盖ExceptTStateT),它对组合顺序很敏感,让我表达一些东西像

  

此功能需要优先于错误的效果   状态效应,但我让你选择确切的错误和状态   的实施方式。

  

此函数需要优先于状态的状态效果   错误效果,但我让你选择确切的错误和状态   的实施方式。

以这种方式只有具有正确顺序的堆栈具有所需的实例。

我不知道如何在类型类约束中嵌入效果优先级。我需要某种Constraint -> Constraint的“约束变换器”吗?也许某些约束由类型级别的约束参数化?

0 个答案:

没有答案