runST

2016-09-27 8 views
9

Haskell'deki ST monadını doğru bir şekilde anlarsam, runST, bir hesaplamanın tekdüzeden kaçarken başka bir iş parçacığına başvurmadığından emin olmak için sıralı-2 türleri kullanır.runST

Bir Hindley-Milner tipi sisteme sahip bir oyuncak dilim var ve sorum şu: H tipi sistem, runST uygulamalarını yazmanız için ad-hoc kuralıyla genişletmek ve böylece ST monad güvenli bir şekilde kullanılabilir rank-2 türlerini tanıtmadan kaçabilir, ? Daha doğrusu

, runST tip forall s a. ST s a -> a olurdu (yani rank-1) ve ilk HM let-ifadelerde türlerini genelleştirir aynı şekilde hesaplama türünü genelleme ama eğer bir tür hatası yükseltmek için çalışacağını söyledi yazarak kuralı s tip değişkeninin bağlı olduğu bulunmuştur.

yukarıda sadece kabul kısıtlarsa programları vanilya HM kıyasla, bu yüzden sesi gibi görünüyor, ama ben emin değilim. Bu işe yarar mı? sorusuna yorumlar tamamen net değildir Ne olur ne

+6

Evet, bir şekilde 'runST' ekleyebilirsiniz: İlginçtir ki, bu hiç biri rank 2 tipi imzalarını gerektiren, bir ST türünü tanıtan bir şey için özel kuralların yapmaya gerek sonunda yok Gerekli kontrolleri yapan özel yazım kuralı. Biri Ayrıca tip değişken 's' a'' görünmez kontrol etmeli görünüyor – augustss

+0

Tamam aksi devlet monad dışında sızıntı olabilir, teşekkürler. – max

+0

:-) – max

cevap

2

, sen gerekir yargı

{\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]}

Bu Hindley-Milner ile gelen diğer olağan yazarak kararları ile birlikte tabii olmasıdır.

newSTRef :: a -> ST s (STRef s a) 
readSTRef :: STRef s a -> ST s a 
writeSTRef :: STRef s a -> a -> ST s() 
...