ST Monad中堆栈的优秀(特别是快速)实现会像我习惯使用命令式语言一样吗?我想出了这个,但我不确定是否会有更好或更快的解决方案。
import Control.Monad.ST
import Data.STRef
import Control.Monad
stackDemo :: [Int] -> [Int]
stackDemo ls = runST $ do
stack <- newSTRef []
forM_ ls $ \i -> do
temp <- readSTRef stack
let x = 2 * i
writeSTRef stack (x : temp) -- push element on stack
readSTRef stack -- read out stack and return it
调用它给出
*Main> stackDemo [1 .. 10]
[20,18,16,14,12,10,8,6,4,2]
最后,我只想要一个保持参照透明度的函数,并在其代码中的某个位置使用快速堆栈。