gpt4 book ai didi

haskell - 结合 StateT 和 State monad

转载 作者:行者123 更新时间:2023-12-03 14:57:59 25 4
gpt4 key购买 nike

可以说我有一个功能

f :: State [Int] Int

和一个功能:
g :: StateT [Int] IO Int

我想使用 fg并传递它们之间的状态。是否有库函数 StateT (return . runState f) ?或者一般来说,给定一个具有相应 monad 的 monad 转换器,是否有它的库函数?

最佳答案

更一般地说,您要做的是将转换应用于变压器堆栈的内层。对于两个任意 monad,类型签名可能如下所示:

fmapMT :: (MonadTrans t, Monad m1, Monad m2) => (m1 a -> m2 a) -> t m1 a -> t m2 a

基本上是更高级别的 fmap .事实上,将它与最终参数上的映射结合起来可能更有意义:
fmapMT :: (MonadTrans t, Monad m1, Monad m2) => (m1 a -> m2 b) -> t m1 a -> t m2 b

显然,这在所有情况下都不可能,尽管当“源”单子(monad)是 Identity 时它可能更容易,但我可以想象为它工作的地方定义另一个类型类。我认为典型的 monad 转换器库中没有这样的东西。然而,一些关于 hackage 的浏览会出现非常相似的 in the Monatron package :
class MonadT t => FMonadT t where
tmap' :: FunctorD m -> FunctorD n -> (a -> b)
-> (forall x. m x -> n x) -> t m a -> t n b

tmap :: (FMonadT t, Functor m, Functor n) => (forall b. m b -> n b)
-> t m a -> t n a
tmap = tmap' functor functor id

tmap' 的签名中, FunctorD类型基本上是 fmap 的临时实现而不是使用 Functor直接实例。

此外,对于两个类似 Functor 的类型构造函数 F 和 G,类型类似于 (forall a. F a -> G a) 的函数描述 a natural transformation从 F 到 G。很可能在 category-extras 中的某处有您想要的变压器映射的另一种实现。包,但我不确定 monad 转换器的类别理论版本是什么,所以我不知道它可能被称为什么。

由于 tmap只需要 Functor实例(任何 Monad 必须具有)和自然变换,以及任何 MonadIdentity 有一个自然变换monad 由 return 提供, 你想要的函数可以写成 FMonadT 的任何实例。如 tmap (return . runIdentity) --假设“基本” monad 被定义为应用于 Identity 的转换器的同义词,无论如何,变压器库通常就是这种情况。

回到你的具体例子,注意 Monatron 确实有一个 FMonadT 的实例。对于 StateT .

关于haskell - 结合 StateT 和 State monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4138671/

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