2012-09-15 119 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