在学习和试验Data.Vector.Unboxed.Mutable
与runST
的使用时,我们提出了以下代码:
{-# 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
但没有成功。
test
但在runST
之外计算test
函数?正在阅读this,但仍然不清楚它为什么不起作用。答案 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
中进行测试。