Ult*_*Pea 2 haskell state-monad monad-transformers
我有两个或更多独立状态要在一个Haskell应用程序中跟踪.
我正在使用声明两个新类型
type MonadTuple m = MonadState (Int, Int) m
type MonadBool m = MonadState Bool m
Run Code Online (Sandbox Code Playgroud)
monad变换器堆栈声明为
type Stack = StateT (Int, Int) (StateT Bool IO) ()
Run Code Online (Sandbox Code Playgroud)
我打算像这样使用堆栈
ret :: Stack
ret = apply
apply :: (MonadTuple m, MonadBool m) => m ()
apply = undefined
Run Code Online (Sandbox Code Playgroud)
该编译器是不高兴,因为它不能匹配Bool与(Int, Int)试图检查时Stack符合MonadBool.
我知道在StateT中组合多个状态时给出的解决方案.除了箭头或带镜头的全局状态之外,还有其他更简单的解决方案吗?
附录:完整的代码块是
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}
import Control.Monad.State.Class
import Control.Monad.State.Lazy
type MonadTuple m = MonadState (Int, Int) m
type MonadBool m = MonadState Bool m
type Stack = StateT (Int, Int) (StateT Bool IO) ()
ret :: Stack
ret = apply
apply :: (MonadTuple m, MonadBool m) => m ()
apply = undefined
Run Code Online (Sandbox Code Playgroud)
定义MonadState具有功能依赖性m -> s,这意味着一个monad m必须至多有一个实例MonadState s m.或者,更简洁地说,同一个monad不能有MonadState两个不同状态的两个实例,这正是你想要做的.