Haskell:无法弄清楚如何使用monad变换器堆栈

ram*_*ion 3 monads haskell monad-transformers

我有一个类型

type T s r a = StateT [s] (ListT (Reader r)) a
Run Code Online (Sandbox Code Playgroud)

我想创建一个monadic值,产生每个当前状态

states :: T a r a
Run Code Online (Sandbox Code Playgroud)

但我今天感觉很愚蠢,我无法弄清楚如何将价值转化T a r [a]T a r a.

states = do
  as <- get
  -- insert magic
  return a
Run Code Online (Sandbox Code Playgroud)

ram*_*ion 5

想出了办法

states = do
  as <- get
  a <- lift . ListT $ return as
  return a
Run Code Online (Sandbox Code Playgroud)

哪个可以压缩到

states = get >>= lift . ListT . return
Run Code Online (Sandbox Code Playgroud)

好的,现在感觉更聪明