在MonadRandom中运行runST

时间:2017-02-12 17:24:44

标签: haskell monads

我想在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'

时的错误

1 个答案:

答案 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