SORU
4 NİSAN 2011, PAZARTESİ


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: , *, **ST0 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
4 NİSAN 2011, PAZARTESİ


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CaptainDisillusion

    CaptainDisil

    18 EYLÜL 2007
  • Dirty Loops

    Dirty Loops

    21 Mayıs 2007
  • eisleyhead

    eisleyhead

    11 Ocak 2006