小编fel*_*lix的帖子

如何分离具有副作用的组件?

我正在尝试在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)

monads haskell monad-transformers

7
推荐指数
0
解决办法
223
查看次数

标签 统计

haskell ×1

monad-transformers ×1

monads ×1