gpt4 book ai didi

haskell - 是否可以实现 `(Applicative m) => Applicative (StateT s m)` ?

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

我目前正在研究 Data.FreshControl.Monad.Trans.Fresh,分别是。定义一个用于生成新变量的接口(interface),以及一个实现该接口(interface)的 monad 转换器。

我最初认为可以为我的 FreshT v m 实现 Applicative 实例,唯一要求是 Applicative m 存在。然而,我陷入困境,似乎我需要 require Monad m。我不相信我的 Haskell-fu,然后转向 Transformer 包,并对在 Control.Monad.Trans.State.Lazy.Strict 中发现的内容感到惊讶:

instance (Functor m, Monad m) => Applicative (StateT s m) where
pure = return
(<*>) = ap

所以这是我的问题:是否可以使用以下实例头创建具有等效语义的实例?

instance (Applicative m) => Applicative (StateT s m) where

最佳答案

考虑您有两个功能:

 f :: s -> m (s, a -> b)
g :: s -> m (s, a)

你想创建一个函数h = StateT f <*> StateF g

 h :: s -> m (s, b)

从上面你有一个 s您可以发送至f所以你有:

 f' :: m (s, a -> b)
g :: s -> m (s, a)

但是得到sf'你需要 Monad (无论你用 applicative 做什么,它仍然采用 m s 的形式,所以你无法将该值应用于 g )。

您可以使用定义并使用 free monad但为了国家的崩溃,你需要 join .

关于haskell - 是否可以实现 `(Applicative m) => Applicative (StateT s m)` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18673525/

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