Devlet, ST arasındaki fark, İORef ve MVar
Write Yourself a Scheme in 48 Hours ile çalışıyorum (yaklaşık 85hrs değilim) ve Adding Variables and Assignments ilgili kısmı aldım. Bu bölümde büyük bir kavramsal sıçrama var, ve arasında ziyade direk nihai çözüm için Atlama iyi bir düzenleme ile iki adımda yapılıyor olsaydı. Neyse
Aynı amaca hizmet ediyor gibi farklı sınıfları bir dizi kaybım oldu: , *, **ST
0 2*, MVar
. İlk üç geçen ilk üç hakkında StackOverflow soru çok tercih cevap gibi görünüyor süre. metinde. Onlar üst üste çağırmaları arasında bir eyaletimiz gibi görünüyor.
Bu her ne kadar birbirinden farklıdır.
Özellikle bu cümleler mantıklı değil:
Bunun yerine, bir özellik adı kullanıyoruzdevlet konularıbizim için toplu devlet yönetme Haskell izin. Bu başka bir programlama dili olarak kesilebilir değişkenleri, işlevleri veya değişkenler elde etmek için kullanarak bize görmesini sağlar.
ve
İORef modülü durumsal değişkenleri kullanmanızı sağlarIO monad içinde.
Tüm bu satırı type ENV = IORef [(String, IORef LispVal)]
karmaşık hale getirir - neden ikinci IORef
? EÄŸer type ENV = State [(String, LispVal)]
yerine yazacağım sonu ne olacak?
CEVAP
Devlet Monad : deÄŸiÅŸken model bir devlet
Devlet monad basit bir API ile devlet programları için: tamamen işlevsel bir ortamdır
- olsun
- koyun
the mtl package Dokümantasyon.
Devlet monad kontrol tek bir iş parçacığı içinde devlet ihtiyacı olduğunda yaygın olarak kullanılır. Aslında kendi uygulamasında değişken devlet kullanmaz. Bunun yerine, program durum değeri (tüm hesaplamaları için ek bir parametre olduğu devlet yani) tarafından parametrelenmiştir. Devlet yalnızca tek bir iş parçacığı (ve olamaz iş parçacıkları arasında paylaşılan) mutasyona uğramış görünüyor.
ST monad ve STRefs
ST monad IO monad yalnızca benim kuzenim.
Keyfi sağlardevlet kesilebilirmakine gerçek değişken bellek olarak uygulanır. API rank-2 tipi parametre yerel kapsam kaçan değişken durumu bağımlı değerler engeller olarak güvenli ve yan etkisi ücretsiz programlar ile yapılmış.
Böylece mutability yoksa saf programları kontrol sağlar.
Yaygın değişken diziler ve mutasyona uğramış diğer veri yapıları için kullanılan, daha sonra donmuş. Değişken devlet olduğu için de çok etkilidir,"". donanım hızlandırmalı
Birincil API:
- Control.Monad.ST
- runST ... hafıza etkisi yeni bir hesaplama.
- Ve 12**: (yerel) değişken hücre işaretçileri.
- ST-tabanlı diziler (vektör) da yaygındır.
IO monad daha az tehlikeli kardeş gibi düşün. Ya da sadece ve bellek okuma yazma nerede IO.
Ä°ORef : Ä°O STRefs
Bu IO monad içinde STRefs (yukarda). Konum hakkında STRefs aynı güvenlik garantisi yok.
MVars : kilitler ile Ä°ORefs
Bir kilit güvenli . ekli ile STRefs veya İORefs gibi, ama ^em>eşzamanlıbirden çok iş parçacığı erişim. İORefs ve STRefs atomicModifyIORef
(bir karşılaştırma ve takas işlemi atom) kullanırken sadece çok dişli bir ortamda güvende. MVars güvenle kesilebilir devlet paylaştığınız için daha genel bir mekanizmadır.
Genellikle, STRef veya İORef üzerinde Haskell, MVars veya TVars (STM tabanlı değişken hücreleri) kullanın.
Strateji Tasarım deseni ve Devlet dese...
Px, dp, arasındaki fark ve Android dip...
'dizi arasındaki fark ne ve dize?...
İÇ ve DIŞ birleşimler arasındaki fark...
Bir URI, URL ve URN arasındaki fark ne...