4

我正在玩http://hackage.haskell.org/packages/archive/vault/0.2.0.0/doc/html/Data-Vault-ST.html并想编写如下函数:

onVault  f = runST (f <$> Vault.newKey)
onVault2 f = runST (f <$> Vault.newKey <*> Vault.newKey)

等等。如果我用不带参数的函数替换这些函数并调用特定函数而不是 f,它可以工作,但这些高阶函数不会进行类型检查。

发生了什么事,我可以解决它吗?

4

1 回答 1

4

您需要给出2 种类型onVault并对其进行onVault2 排名

{-# LANGUAGE Rank2Types #-} -- RankNTypes would also work

onVault :: (forall s. Key s a -> b) -> b
onVault2 :: (forall s. Key s a -> Key s b -> c) -> c

这是因为runST :: (forall s. ST s a) -> a要求传递的动作在状态线程参数中是多态的s,这是一种用于保证纯度的类型级技巧。有关详细信息,请参阅HaskellWiki 上的 ST monad 文章

于 2012-09-15T01:31:33.230 回答