2013-01-25 10 views
7
Ben web app-imsi hizmetlerini geliştirerek Haskell daha aşina almaya çalışıyorum

sürdürmek. Haskell Websunucusu: Uygulama durumuna

Bir web-sunucu geliştiriyorum Say ve istekler arasında kalıcı durumunu tutmak istiyorum; örneğin bir sayaç. Haskell şeyleri yapmanın yolu nedir?

benim Google aramasında bu discussion geldi. Önerilen çözüm, yapmamanın iyi bir örneğine benziyor.

Bir fikir ben istek işleyicisi bir Mvar almak başlamıştı vardı:

requestHandler :: MVar State -> IO (Maybe Response) 

işleyicisi kaydederken, bir MVAr ile curried olabilir ana oluşturulan.

daha iyi bir yolu olmalı. Yardım edemiyorum ama bu soruna işlevsel olmayan bir şekilde yaklaştığımı düşünüyorum.

Teşekkürler! verir Muhtemelen acid-state istiyorum

+0

Neden sunucunun kendisinde kalıcı durumunu taşımak için deneyin:

devlet her oturum için benzersiz bir sayaç olacak? Bana öyle geliyor ki, Haskell RESTful bir tasarımla çok daha iyi eşleşir. –

+1

Bu yaklaşım hakkında "işlevsel olmayan" nedir? Paylaşman gereken bir eyaletin var, o yüzden sarın ve referansı geç. Bana oldukça basit geliyor. – sclv

+0

sclv: Daha çok FRP yaklaşımının olup olmadığını merak ediyorum. – David

cevap

4

, bu tam olarak: Haskell veri türleri için kalıcı hal. Bağladığım belgeler bile istediğin gibi bir talep sayacıyla başlar. MVars kalıcı değildir

Not; Sunucu yeniden başlatıldığında sayaç sıfırlanır. Bu aslında istediğiniz davranışsa, bunun yerine bir TVar kullanmanızı öneririm; Bu sayede sayacı atomik olarak kilitleri olmadan veya onlarla birlikte gelen kilitlenme riskini sıfırlayabilirsiniz.

1

Kalıcılığı ve TVarları beğenirseniz, aynı semantiğe ve TV dizileriyle aynı kullanım modellerine sahip DBRefs'u kullanabilirsiniz. Durum için benzersiz bir anahtar tanımlamanız ve otomatik dosya kalıcılığına sahip olmanız gerekir. Veritabanı kalıcılığı için bir IResource örneği tanımlamak gerekir.

import Data.Map as M 
import Data.TCache 
import Data.TCache.DefaultPersistence 

type Counter= Int 
type SessionId :: String 
data State= State SessionId Counter deriving (Read, Show, Typeable) 

instance Indexable State where 
     key (State k _)= k 

requestHandler :: Request -> DBRef State -> IO (Maybe Response)