在ST Monad中正确实现类似堆栈的结构

时间:2018-04-01 01:53:51

标签: haskell

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]

最后,我只想要一个保持参照透明度的函数,并在其代码中的某个位置使用快速堆栈。

0 个答案:

没有答案