В процессе обучения и экспериментирования использование Data.Vector.Unboxed.Mutable
с runST
придумал этот код:Haskell падает с runST и Data.Vector.Unboxed.Mutable
{-# 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, но все еще не понял, почему он не работает.
Хорошо. Первая часть хорошая. Но, во-вторых, я не хочу этого на главном, я хочу его на другой функции (testParent), как развернуть эту монаду, чтобы получить 'int'? – OneEyeQuestion
'runST' разворачивает значение; 'runST $ test 5' - это просто' Int', поэтому вы можете сказать такие вещи, как 'let x = 3 * (runST $ test 5)' – ErikR
Почему тогда 'testParent = runST $ test 5' не компилируется? – OneEyeQuestion