Haskell 向量的一元创建(或者:有人能帮我输入注释吗?)
在讨论Fisher-Yates shuffle的实现时,我遇到了以下代码:Haskell 向量的一元创建(或者:有人能帮我输入注释吗?),haskell,monads,Haskell,Monads,在讨论Fisher-Yates shuffle的实现时,我遇到了以下代码: randomIs g n = fill g 0 where v = enumFromN 0 n fill g i = when (i < n) $ do let (x,g') = randomR (i, n-1) g G.swap v i x fill g' (i+1) 如您所见,我正在避免使用Data.Vector.G
randomIs g n = fill g 0
where
v = enumFromN 0 n
fill g i = when (i < n) $ do
let (x,g') = randomR (i, n-1) g
G.swap v i x
fill g' (i+1)
如您所见,我正在避免使用Data.Vector.Generic
,以排除可能由于理解不正确而导致的错误源。我还在ST
monad中做一些事情
在我看来,fill
的类型应该是
UMVect.MVector (ST s (UVect.Vector Int)) Int -> Int -> a -> ST s ()
但GHC反对。有什么提示吗?再次:它会检查我是否没有注释fill
旁注:我还希望
randomPermutation
返回更新后的随机数生成器。因此,我需要fill
来处理生成器的状态。由于我目前的类型混乱,我不知道如何巧妙地做到这一点。有什么提示吗?编译错误告诉我们:
Expected type: ST s (UMVect.MVector (ST s (UVect.Vector Int)) Int)
Actual type: ST s (UMVect.MVector (Control.Monad.Primitive.PrimState (ST s)) Int)
因此,将
fill
的类型签名更改为UMVect.MVector(PrimState(sts))Int->Int->a->sts()
(添加import Control.Monad.Primitive
)解决了问题 啊哈,谢谢你。不过,我不会将此设置为可接受的答案,以防有人可以解释原始代码中的类型。
Expected type: ST s (UMVect.MVector (ST s (UVect.Vector Int)) Int)
Actual type: ST s (UMVect.MVector (Control.Monad.Primitive.PrimState (ST s)) Int)