不変ベクトルを取り、不変ベクトルを返す汎用ベクトル関数を作成しようとしていますが、(一時的な) 可変ベクトルで動作します。私の問題を示す簡単な例は次のとおりです。
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 変数を適切に使用する方法を理解することもできません。どうすればtest
コンパイルできますか?