Haskell 有人能帮这个单子转换片段去糖吗?
用这个方便的do符号写的,这对我来说似乎很清楚。但我似乎无法使用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
>=
使去糖版本正常工作,这令人担忧。有人能把这些用扩展符号重新写一下吗
不嵌套
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也有问题