Your stack signature in the monad is already valid.
Pick up the calculations from the monad []and bind its value. This will cause a calculation:
test :: StateT Int [] Int
test = do
s <- lift [1,2,3]
put s
v <- get
return v
Testing to see it work:
*Main> runStateT test 10
[(1,1),(2,2),(3,3)]
Not only a lot of results, but the condition is also included in non-determinism.
If it testhad a type ListT (State Int) Int, only the results would be non-deterministic, the state would be divided between all branches in the calculation:
test :: ListT (State Int) Int
test = do
s <- ListT $ return [1,2,3]
put s
v <- get
return v
Result:
*Main> runState (runListT test) 10
([1,2,3],3)