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