Haskell 有人能帮这个单子转换片段去糖吗?

Haskell 有人能帮这个单子转换片段去糖吗?,haskell,monad-transformers,Haskell,Monad Transformers,用这个方便的do符号写的,这对我来说似乎很清楚。但我似乎无法使用>=使去糖版本正常工作,这令人担忧。有人能把这些用扩展符号重新写一下吗 不嵌套 stack1 :: StateT Int Identity ( Int, Int ) stack1 = do a <- get put ( a + 1 ) b <- get return ( a, b ) runstack1 :: ( Int, Int ) runstack1 = evalState sta

用这个方便的do符号写的,这对我来说似乎很清楚。但我似乎无法使用
>=
使去糖版本正常工作,这令人担忧。有人能把这些用扩展符号重新写一下吗

不嵌套

stack1 :: StateT Int Identity ( Int, Int )
stack1 = do
    a <- get 
    put ( a + 1 )
    b <- get
    return ( a, b )

runstack1 :: ( Int, Int )
runstack1 = evalState stack1 11
stack1::StateT Int Identity(Int,Int)
stack1=do

嵌套示例的去糖化版本:

stack4 :: StateT Int ( StateT String ( StateT String Identity ) ) ( Int, String, String )
stack4 = modify (+10) >>= \_ ->
         (lift $ modify ( ++ " world" )) >>= \_ ->
         (lift . lift $ modify ( ++ " word" )) >>= \_ ->
         get >>= \a ->
         lift get >>= \b -> 
         (lift . lift $ get) >>= \c ->
         return (a,b,c)
应用式:

import Control.Applicative

stack5 :: StateT Int ( StateT String ( StateT String Identity ) ) ( Int, String, String )
stack5 = modify (+10) *> 
         (lift $ modify ( ++ " world" )) *>
         (lift . lift $ modify ( ++ " word" )) *>  
         ((,,) <$> get <*> lift get <*> (lift . lift $ get))
导入控件。应用程序
stack5::StateT Int(StateT String(StateT String Identity))(Int,String,String)
堆栈5=修改(+10)*>
(lift$modify(++“world”)*>
(lift.lift$modify(++“word”)*>
((,)获得提升(提升。提升$get))
此外,Lambdabot可以执行自动脱胶,请参阅


至于对
runIdentity
的需求,这一点并不神秘。您必须展开monad堆栈的每一层,才能获得其中的值,而
Identity
恰好位于堆栈中。现在,
State
monad可以根据
StateT
Identity
实现,但是在这种情况下,用户会看到一个隐藏内部机器的“统一视图”。如果您在
transformers
包中检查
runState
的源代码,您将看到它在内部调用
runIdentity

嵌套示例的卸载版本:

stack4 :: StateT Int ( StateT String ( StateT String Identity ) ) ( Int, String, String )
stack4 = modify (+10) >>= \_ ->
         (lift $ modify ( ++ " world" )) >>= \_ ->
         (lift . lift $ modify ( ++ " word" )) >>= \_ ->
         get >>= \a ->
         lift get >>= \b -> 
         (lift . lift $ get) >>= \c ->
         return (a,b,c)
应用式:

import Control.Applicative

stack5 :: StateT Int ( StateT String ( StateT String Identity ) ) ( Int, String, String )
stack5 = modify (+10) *> 
         (lift $ modify ( ++ " world" )) *>
         (lift . lift $ modify ( ++ " word" )) *>  
         ((,,) <$> get <*> lift get <*> (lift . lift $ get))
导入控件。应用程序
stack5::StateT Int(StateT String(StateT String Identity))(Int,String,String)
堆栈5=修改(+10)*>
(lift$modify(++“world”)*>
(lift.lift$modify(++“word”)*>
((,)获得提升(提升。提升$get))
此外,Lambdabot可以执行自动脱胶,请参阅


至于对
runIdentity
的需求,这一点并不神秘。您必须展开monad堆栈的每一层,才能获得其中的值,而
Identity
恰好位于堆栈中。现在,
State
monad可以根据
StateT
Identity
实现,但是在这种情况下,用户会看到一个隐藏内部机器的“统一视图”。如果您在
transformers
包中检查
runState
的源代码,您将看到它在内部调用
runIdentity

嵌套StateT非常奇怪。为什么不定义一个单级StateT?@DonStewart woa你写的真实世界Haskell!但是,是的,我修正了这个问题,所以现在有了更符合逻辑的进展。另外,我在单堆栈StateT方面遇到了问题,嵌套StateT也很奇怪。为什么不定义一个单级StateT?@DonStewart woa你写的真实世界Haskell!但是,是的,我修正了这个问题,所以现在有了更符合逻辑的进展。另外,单堆栈StateT也有问题