首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现StateT应用程序(StateT)

实现StateT应用程序(StateT)
EN

Stack Overflow用户
提问于 2015-01-12 13:57:47
回答 2查看 441关注 0票数 3

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

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

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

代码语言:javascript
复制
liftA2 (<*>) :: (Applicative f, Applicative f1) => f (f1 (a -> b)) -> f (f1 a) -> f (f1 b)

实现应用程序但我不能在这里实现它。我正在进行的工作围绕以下几个方面尝试了许多选择:

代码语言:javascript
复制
-- (<*>) :: 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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-12 14:04:27

一个实现(取自托尼·莫里斯函数式编程课程)可以是

代码语言:javascript
复制
(<*>) :: (Functor f, Monad f) =>
  StateT s f (a -> b)
  -> StateT s f a
  -> StateT s f b
StateT f <*> StateT a =
  StateT (\s -> (\(g, t) -> (\(z, u) -> (g z, u)) <$> a t) =<< f s)
票数 2
EN

Stack Overflow用户

发布于 2015-01-12 14:37:12

Tony使用了一些替代符号,Simon的回答非常简洁,下面是我最后得出的结论:

代码语言:javascript
复制
-- (<*>) :: 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转换器定义的一部分,据我所知。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27903650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档