2012-09-15 76 views

回答

4

您需要给onVaultonVault2rank 2 types

{-# 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,这是用来保证纯度类型级特技多态性。详情请参阅the ST monad article on HaskellWiki

+0

嗯......我担心它可能是这样的。看来,如果我让结果放入'ST'中,并在稍后使用该值时调用'runST',那也可以。 – singpolyma

+1

@singpolyma:是的,因为它将(隐式)量词放在's'的最外层,这使得它成为一个可以推断的正常秩1类型,并且不需要扩展。 – hammar