Haskell与runST和Data.Vector.Unboxed.Mutable崩溃

时间:2014-11-14 23:25:14

标签: haskell state-monad

在学习和试验Data.Vector.Unboxed.MutablerunST的使用时,我们提出了以下代码:

{-# LANGUAGE BangPatterns #-}
import qualified Data.Vector.Unboxed.Mutable as UVM (unsafeNew, unsafeWrite, unsafeRead)
import Control.Monad.ST

test :: Int -> Int
test len = runST $ do
    vec <- UVM.unsafeNew (len - 1)
    let
        fill !i
            | i >= len  = sumVec 0 0
            | otherwise = do
                UVM.unsafeWrite vec i i
                fill (i + 1)
        sumVec !k !total
            | k >= len  = return total
            | otherwise = do
                x <- UVM.unsafeRead vec k
                sumVec (k + 1) (total + x)
    fill 0

testParent = test 5

如果我运行它,Haskell就会停止工作。我试图让这项工作来到这里:

test :: Int -> Int
test len = do
.
.
.
testParent = runST $ test 5

但没有成功。

  • 为什么Haskell(7.8.3)与提供的代码崩溃?
  • 如何使用test但在runST之外计算test函数?正在阅读this,但仍然不清楚它为什么不起作用。

1 个答案:

答案 0 :(得分:4)

在这一行:

vec <- UVM.unsafeNew (len - 1)

您正在创建一个长度为len-1的向量。但是你写入索引0到len-1所以你需要一个长度为len的向量。

将其更改为len,它会起作用。

关于你的第二个问题,你可以像这样使用runST

-- test now begins with the `do` statement
test len = do
  vec <- UVM.unsafeNew len
  ...

main = print $ runST $ test 5

main现在必须将调用包装在runST中进行测试。