2016-09-27 8 views
9

ハスケルのSTモナドが正しく理解されている場合、runSTはモナドをエスケープする際に計算が他のスレッドを参照しないように賢明な方法でランク2型を使用します。ヒンドレーミルナー型システムを持つrunST

私はHindley-Milnerタイプのシステムでおもちゃの言語を使用しています。私の質問は次のとおりです.STモナドが安全になるようにrunSTアプリケーションを入力するアドホックルールを使用してHMタイプシステムを拡張できますか?脱税可能、ランク2タイプを導入しないで?

より正確には、runSTはタイプforall s a. ST s a -> a(すなわち、ランク-1)を持っているだろうと型付け規則が最初のHMは、LET-式での型を一般と同じ方法で計算式を一般化しようとしますが、あれば型エラーを引き上げますs型変数がバインドされています。

上記は、バニラHMと比較して許容されるプログラムのみを制限しているので、音が良いように見えますが、わかりません。これは効果がありますか?質問へのコメントは完全には明らかではありません念の

+6

はい、あなたのように 'runST'を追加することができます。興味深いことに、我々はこれらのいずれもいるので、ランク2の型シグネチャを必要とし、STタイプを導入するもののための特別なルールを作成する必要が終わるません必要な小切手を行う特別なタイピング規則。 – augustss

+0

ありがとうございました:-) – max

+0

型変数 's'が' a'に現れていないかチェックしなければなりません。さもなければ、状態がモナドの外側に漏れる可能性があります。 – max

答えて

2

は、あなたが必要となる判断は

{\Gamma \vdash e \colon \forall s.\, {\tt ST}\, s\, a ~~~~ s \not\in \text{free}(a)\over \Gamma \vdash {\tt runST}\, e \colon a} ~~\text{[runST]}

これはHindley-Milnerが付属して他の通常のタイピングの判断と併せて、もちろんです。

newSTRef :: a -> ST s (STRef s a) 
readSTRef :: STRef s a -> ST s a 
writeSTRef :: STRef s a -> a -> ST s() 
... 
関連する問題