我想在Rand-monad中做runST
,但是我无法正确获取类型,GHC的输出也没有特别的帮助:
import Control.Monad
import Control.Monad.Random as MR
import Control.Monad.ST
import Control.Monad.Trans
import qualified Data.Vector.Unboxed as VU
shuffle :: (MonadRandom m) => m (VU.Vector Int)
shuffle = do
k <- getRandomR (0::Int, 10::Int)
let vec = runST $ do
vector <- VU.unsafeThaw (VU.enumFromN (1::Int) k)
vector' <- VU.unsafeFreeze vector
return vector
return vec
解析输入`vector'
时的错误
答案 0 :(得分:2)
该错误通常与缩进问题有关。如果你稍微缩进runST
块中的行,那么该错误就会消失。
下一个问题是您返回了错误的向量(忘记了'
)。
最后,绑定一个值只是为了在下一行使用return函数是多余的。
这是工作代码:
shuffle :: (MonadRandom m) => m (VU.Vector Int)
shuffle = do
k <- getRandomR (0::Int, 10::Int)
let vec = runST $ do
vector <- VU.unsafeThaw (VU.enumFromN (1::Int) k)
VU.unsafeFreeze vector
return vec
可替换地,
shuffle :: (MonadRandom m) => m (VU.Vector Int)
shuffle = do
k <- getRandomR (0::Int, 10::Int)
return $ runST $ do
vector <- VU.unsafeThaw (VU.enumFromN (1::Int) k)
VU.unsafeFreeze vector