gpt4 book ai didi

Haskell——使用 StateT monad 转换器链接两个状态

转载 作者:行者123 更新时间:2023-12-02 17:49:58 27 4
gpt4 key购买 nike

我在一个 Haskell 应用程序中需要跟踪两个或多个独立状态。

我使用

声明两个新类型类
type MonadTuple m = MonadState (Int, Int) m
type MonadBool m = MonadState Bool m

Monad 转换器堆栈声明为

type Stack = StateT (Int, Int) (StateT Bool IO) ()

我打算这样使用堆栈

ret :: Stack
ret = apply

apply :: (MonadTuple m, MonadBool m) => m ()
apply = undefined

编译器很不高兴,因为在尝试检查 Stack 是否符合 时,它无法将 Bool(Int, Int) 匹配MonadBool.

我知道 Combining multiple states in 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

最佳答案

The definition of MonadState具有函数依赖性 m -> s,这意味着一个 monad m 必须最多有一个 MonadState s m 实例。或者,更简单地说,同一个 monad 不能有两个不同状态的 MonadState 实例,而这正是您想要做的。

关于Haskell——使用 StateT monad 转换器链接两个状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49782175/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com