Haskell 这个简单的函数叫什么?

Haskell 这个简单的函数叫什么?,haskell,functional-programming,monads,monad-transformers,state-monad,Haskell,Functional Programming,Monads,Monad Transformers,State Monad,您已经看到以下函数了吗?它叫什么?它有什么用处?它的定义是否可以比仅针对StateT更一般 simpleFunction (StateT f) = StateT $ (\s -> return (f s, s)) 顺便说一下,ghc给它的类型是Monad n=>StateT s m a->StateT s n(m(a,s)) 还有一个替代定义: simpleFunction m = do s <- get mapStateT (\l -> return (l, s))

您已经看到以下函数了吗?它叫什么?它有什么用处?它的定义是否可以比仅针对
StateT
更一般

simpleFunction (StateT f) = StateT $ (\s -> return (f s, s))
顺便说一下,ghc给它的类型是
Monad n=>StateT s m a->StateT s n(m(a,s))

还有一个替代定义:

simpleFunction m = do
  s <- get
  mapStateT (\l -> return (l, s)) m
simpleFunction m=do
s返回(l,s))m

simpleFunction结构通过两件事进行参数化:StateT monad和函数f。正如两个给定定义中所示,simpleFunction从monad的内部获取状态,然后使用给定函数映射计算的返回值和最终状态

下面是一个非常简单的示例,以查看工作示例:

import Control.Monad.State

inc :: State Int Int
inc = do
    n <- get
    put (n + 1)
    return n

simpleFunction = do
                s <- get
                mapState (\l -> (l,s)) inc

main = do
    print $ runState simpleFunction 1
import Control.Monad.State
inc::State Int
inc=do

n有两个单子,如
n(ma)
通常不是很有用(构图可能不是单子等)。所以我想更有用的版本应该是
(Monad m)=>StateT s m a->StateT s m(a,s)

这可以推广到
m
上的任意状态转换器:

import Control.Monad
import Control.Monad.State

f1 :: (MonadState s (t m), MonadTrans t, Monad m) => StateT s m a -> t m (a, s)
f1 (StateT f) = get >>= lift . f
由于我们唯一需要的是
get
,我们可以进一步概括为:

f2 :: (MonadTrans t, Monad m, Monad (t m)) => t m s -> StateT s m a -> t m (a, s)
f2 g (StateT f) = g >>= lift . f

如果你真的需要两个单子,可能会很有用-像
提升
这样的函数或者允许在单子之间切换。

我怀疑这可以比只为
状态
@leftaroundabout更一般地定义:好的观点。你有这样一个通用定义的建议吗?我已经相应地更新了问题。这是家庭作业问题吗;-?我这样问是因为如果是这样的话,可能会有一个简单的答案。如果不是,我不确定是否有答案。你能激发这个问题吗?你能举个例子说明你想如何使用这个函数吗?我认为这个函数不是很深。它只接受当前状态,但在其他方面,
fss::m(a,s)
与剩余的
statetsn
计算是完全独立的。