通用可变向量函数的签名

时间:2012-11-17 07:02:50

标签: haskell mutable higher-rank-types

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

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编译?

0 个答案:

没有答案