我正在尝试在Haskell中创建一个基于代理的系统.为此,我需要在逻辑上将代理和环境部分分开,例如使用不同的测试和真实环境运行.
组件类型,代理和环境都会有很多有状态的东西,所以我选择使用monad变换器堆栈来构建每个组件.我将组件接口移动到类型类,该类由环境实现.实现此类型类的Monad可用于通过将它们插入代理变换器来完成整个变换器堆栈.
我创建了一个工作概念证明,发布在下面.
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleContexts,
GeneralizedNewtypeDeriving #-}
module MonadComponents where
import Control.Monad
import Control.Monad.Reader
import Control.Monad.Trans
class Monad m => Environment m v | m -> v where
envAction :: v -> m v
newtype AgentT r v m a = AgentT {unAgentT :: ReaderT r m a}
deriving (Monad, MonadTrans, MonadReader r)
runAgentT :: (Environment m v) => AgentT r v m a -> r -> m a
runAgentT = runReaderT . unAgentT
instance Environment IO …
Run Code Online (Sandbox Code Playgroud)