- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个作为守护进程运行的程序。
要创建守护进程,用户需要提供一组
每个所需类的实现(其中一个是数据库)
所有这些类都有功能StateT s IO a
形式的类型签名,
但是 s
每个类(class)都不一样。
假设每个类都遵循这种模式:
import Control.Monad (liftM)
import Control.Monad.State (StateT(..), get)
class Hammer h where
driveNail :: StateT h IO ()
data ClawHammer = MkClawHammer Int -- the real implementation is more complex
instance Hammer ClawHammer where
driveNail = return () -- the real implementation is more complex
-- Plus additional classes for wrenches, screwdrivers, etc.
data MultiTool h = MultiTool {
hammer :: h
-- Plus additional fields for wrenches, screwdrivers, etc.
}
StateT (MultiTool h ...) IO ()
中完成大部分工作。
MultiTool
类型
stateMap :: Monad m => (s -> t) -> (t -> s) -> StateT s m a -> StateT t m a
stateMap f g (StateT h) = StateT $ liftM (fmap f) . h . g
withHammer :: StateT h IO () -> StateT (MultiTool h) IO ()
withHammer runProgram = do
t <- get
stateMap (\h -> t {hammer=h}) hammer runProgram
instance Hammer h => Hammer (MultiTool h) where
driveNail = withHammer driveNail
withHammer
的实现,
withWrench
,
withScrewdriver
, ETC。
--withMember accessor runProgram = do
-- u <- get
-- stateMap (\h -> u {accessor=h}) accessor runProgram
-- instance Hammer h => Hammer (MultiTool h) where
-- driveNail = withMember hammer driveNail
最佳答案
如果您想使用像您的情况那样的大型全局状态,那么您想要使用的是镜头,正如 Ben 所建议的那样。我也推荐 Edward Kmett 的 镜头 图书馆。但是,还有另一种可能更好的方法。
服务器具有程序连续运行并在状态空间上执行相同操作的特性。当您想要模块化服务器时,麻烦就开始了,在这种情况下,您需要的不仅仅是一些全局状态。您希望模块有自己的状态。
让我们将模块视为将请求转换为响应的东西:
Module :: (Request -> m Response) -> Module m
现在,如果它有某种状态,那么这种状态就会变得引人注目,因为模块下次可能会给出不同的答案。有多种方法可以做到这一点,例如:
Module :: s -> ((Request, s) -> m (Response s)) -> Module m
但是表达这一点的更好和等效的方式是以下构造函数(我们将很快围绕它构建一个类型):
Module :: (Request -> m (Response, Module m)) -> Module m
该模块将请求映射到响应,但同时也会返回其自身的新版本。让我们更进一步,使请求和响应具有多态性:
Module :: (a -> m (b, Module m a b)) -> Module m a b
现在,如果一个模块的输出类型与另一个模块的输入类型匹配,那么您可以像常规函数一样组合它们。该组合是关联的并且具有多态身份。这听起来很像一个类别,事实上它是!它是一个范畴、一个应用仿函数和一个箭头。
newtype Module m a b =
Module (a -> m (b, Module m a b))
instance (Monad m) => Applicative (Module m a)
instance (Monad m) => Arrow (Module m)
instance (Monad m) => Category (Module m)
instance (Monad m) => Functor (Module m a)
我们现在可以组合两个模块,它们有自己的本地状态,甚至都不知道!但这还不够。我们想要更多。可以切换的模块怎么样?让我们扩展我们的小模块系统,以便模块实际上可以选择不给出答案:
newtype Module m a b =
Module (a -> m (Maybe b, Module m a b))
这允许与
(.)
正交的另一种组合形式。 : 现在我们的类型也是
Alternative
的一族仿函数:
instance (Monad m) => Alternative (Module m a)
现在一个模块可以选择是否响应请求,如果不响应,则尝试下一个模块。简单的。您刚刚重新发明了电线类别。 =)
关于haskell - 在 StateT 中组合多个状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13915923/
Monad 转换器很棘手,我不确定(=没有良好的直觉)哪一个应该放在最上面。 最佳答案 StateT s (ExceptT e m) 这说: 以m开头 添加异常(exception)情况 添加状态 现
我无法找出缩放效果(例如 StateT)的最简洁方法,该效果将值返回到矢量或 map 等索引容器中。 例如,假设我有一些纸牌游戏的结构: data Card = Card { cardValu
我正在编写一个作为守护进程运行的程序。 要创建守护进程,用户需要提供一组 每个所需类的实现(其中一个是数据库) 所有这些类都有功能StateT s IO a 形式的类型签名, 但是 s每个类(clas
为了熟悉 monad 转换器,我编写了以下代码: data GlobalState = GlobalState { rng :: StdGen } foo :: IO () foo =
我在玩Cont描述的单子(monad)技巧here在 this SO question . 这个函数让你“跳回”到计算的早期,接受一个参数,这样你就可以做不同的事情: import Control.M
不同的 IDE 都有其怪癖,因此能够知道您正在使用什么 IDE 来运行 R 有时会很有用。 您可以通过测试 RSTUDIO 来测试您是否正在运行 RStudio。环境变量。 is_rstudio <-
我想弄清楚如何实现 MonadBaseControl 的实例对于 Foo 类型,它是 StateT 实例的新型包装器。你会认为它会像 this 一样实现但情况似乎并非如此。我假设状态块是导致这里问题的
我不明白为什么这段代码只循环一次然后退出? 在 Ghci 中,我只能回答第一个循环,然后似乎变量 cont 设置为 false 并且我没有提示回答。 结果是: *Main> testLoop1 td1
我们如何让用户传递一个 eventHandler,它使用 stateMonad 但在单独的线程中调用?比如下面的例子中,应该如何调用forkIO,以便eventHandler可以调用操作呢?我是 Ha
我确定我一定遗漏了什么。 我是 Haskell 的新手,曲线非常陡峭。在我的玩具项目中,我真的很想使用 State monad 来避免在任何地方传递一千个参数。我无法理解如何将 State monad
我在一个 Haskell 应用程序中需要跟踪两个或多个独立状态。 我使用 声明两个新类型类 type MonadTuple m = MonadState (Int, Int) m type Monad
我正在尝试在 "scalaz-core"%"7.2.14" StateT monad 的组合中创建某种故障转移行为。 StateT monad 包裹 EitherT,因此它是一个 monad 转换器:
这个问题有人问过before ,但没有真正的答案。事实上,公认的答案表明这是不可能的,尽管 StateT 是一个 Monad,因此是 Applicative 的超集。因此,标准库只使用 () = ap
我正在学习 Monad Transformers,其中一个练习要求为 StateT 实现 Monad 实例。我想使用 validity 测试我的实现是否符合 Monad 法则包,类似于 checker
我正在尝试制作一个愚蠢的网络服务器,将数据存储为 State .我正在使用 Web.Scotty . I've used ReaderT before with scotty to access co
我正在尝试使用管道和构建在它上面的各种库来编写一个基本的网络服务器。预期的流程是: 从套接字获取字节串 -> 使用二进制解码 -> 服务器逻辑在这里 -> 向套接字发送响应 我认为会是这样的: fro
具体来说,假设我有这个 monadT 堆栈: type MHeap e ret = MaybeT ( StateT [e] Identity ) ret 和一个方便的 runMheap 函数: run
通过保持 IORef 来通过异常来维护状态似乎要容易得多。而不是尝试使用 State Monad。下面我们有 2 个替代的 State Monad。一用StateT和另一个 ReaderT IORef
可以说我有一个功能 f :: State [Int] Int 和一个功能: g :: StateT [Int] IO Int 我想使用 f在 g并传递它们之间的状态。是否有库函数StateT (ret
有人知道是否有任何(简单的)方法可以让 StatEt 使用 R 2.15 吗?当前 StatEt 版本卡住为 R 2.14 版本。 最佳答案 我使用 StatET 3.0 的测试版本和 RJ 1.1,
我是一名优秀的程序员,十分优秀!