gpt4 book ai didi

haskell - 为 StateT 实现 Applicative (<*>)

转载 作者:行者123 更新时间:2023-12-01 23:17:44 26 4
gpt4 key购买 nike

这个问题有人问过before ,但没有真正的答案。事实上,公认的答案表明这是不可能的,尽管

  • StateT 是一个 Monad,因此是 Applicative 的超集。因此,标准库只使用 (<*>) = ap
  • (如 Petr 所说)组合应用程序总是会产生一个应用程序。

我读过的关于 MaybeT 的实现之一

liftA2 (<*>) :: (Applicative f, Applicative f1) => f (f1 (a -> b)) -> f (f1 a) -> f (f1 b)

实现 Applicative,但我无法在此处完成。我正在进行的工作围绕以下方面尝试了很多选项:

-- (<*>) :: StateT s f (a -> b) -> State s f a -> State s f b
instance (Applicative f) => Applicative (StateT s f) where
pure a = StateT $ \s -> pure (a, s)
(StateT f) <*> (StateT g) = StateT $ \s -> -- f :: s -> m (a -> b, s), g :: s -> m (a, s)
let
mabs = f s -- mabs :: m (a -> b, s)
mab = fmap fst mabs
ms' = fmap snd mabs

in undefined

我想知道我错过了什么,希望我能在这个过程中学到一些关于 Applicative 的东西。

最佳答案

Tony 使用了一些替代符号,而 Simon 的回答非常简洁,所以我最终得到的是:

-- (<*>) :: StateT s f (a -> b) -> State s f a -> State s f b
instance (Monad f, Applicative f) => Applicative (StateT s f) where
pure a = StateT $ \s -> pure (a, s)
StateT f <*> StateT a =
StateT $ \s ->
f s >>= \(g, t) -> -- (f s) :: m (a->b, s)
let mapper = \(z, u) -> (g z, u) -- :: (a, s) -> (b, s)
in fmap mapper (a t) -- (a t) :: m (a, s)

我不得不将 f 也声明为 Monad,但这没关系,因为据我所知,它是 Monad 转换器定义的一部分。

关于haskell - 为 StateT 实现 Applicative (<*>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27903650/

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