Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 向量的一元创建(或者:有人能帮我输入注释吗?)_Haskell_Monads - Fatal编程技术网

Haskell 向量的一元创建(或者:有人能帮我输入注释吗?)

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

在讨论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.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)