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

onVault2種類を与えて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 モナドの記事を参照してください。

于 2012-09-15T01:31:33.230 に答える