2

我正在尝试编写一个通用向量函数,它接受一个不可变向量并返回一个不可变向量,但对(临时)可变向量进行操作。演示我的问题的一个简单示例是:

import Data.Vector.Generic as V
import Control.Monad.ST
import qualified Data.Vector.Mutable as M

test :: (Vector v r) => v r -> v r
test v = runST $ do
  x <- V.thaw v
  -- modify the mutable vector x, code elided
  let s = V.sum x
  M.write x 0 s
  -- continue to modify the mutable vector x, code elided
  V.unsafeFreeze x

此函数无法编译,因为 GHC 无法推断(Vector (Mutable v s) r)。我意识到这是一个问题,但由于runST,

runST :: (forall s. ST s a) -> a

我不能只将此约束添加到test,也不能弄清楚如何适当地使用显式 forall'd 变量。我怎样才能test编译?

4

0 回答 0