gpt4 book ai didi

haskell - 当类型包含自身时该怎么办?

转载 作者:行者123 更新时间:2023-12-02 16:53:02 25 4
gpt4 key购买 nike

我有适用于受限于某种状态的 monad 的代码。我遇到了问题,因为状态有一个需要 monad 的类型变量。

看起来像:

myget :: MonadState (MyState m A) m => m A

现在,当我尝试使其更具体时,出现了问题。例如。只需使用 StateT (在某些内部单子(monad) im 上):

myget' :: StateT <loops here> im A
myget' :: StateT (MyState <loop> A) im A
myget' :: StateT (MyState (MyState <loop> A) A) im A
myget' :: StateT (MyState (MyState (MyState <loop> A) A) A) im A
...
myget' = myget

很明显我不能写这个类型签名;我什至不能将其留给类型推断。

如何解决这个问题?
我确实通过让 myget (第一个一般定义)在 monad 转换器上工作来解决这个问题,并且它确实有效,但是代码不能与其他任何东西很好地配合(因为通常人们将 monad 变压器当作 monad 来使用),所以这不是一个很好的解决方案。

有什么想法吗?

最佳答案

newtype 来救援! newtypedata 声明可以打破循环。

newtype MS s m a = MS
{getMS :: StateT (MyState (MS s m) s) m a}
deriving (Functor, Applicative, Monad)

deriving instance Monad m =>
MonadState (MyState (MS s m) s) (MS s m)

instance MonadTrans (MS s) where
lift = MS . lift

关于haskell - 当类型包含自身时该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39755060/

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