2016-09-01 19 views
10

Ben örneğin, bazı basit ilkel operasyonları var: operational monadın durumundaHaskell disk "operasyonel" veya "serbest monad" devamı olarak saklanabilir mi?

:

import Control.Monad.Operational 
type Process a = Program ProcessI a 
data ProcessI a where 
    GetInput :: ProcessI String 
    Dump :: String -> ProcessI() 
getInput :: Process String 
getInput = singleton GetInput 
dump :: String -> Process() 
dump = singleton . Dump 

Veya free monadın durumunda

:

import Control.Monad.Free 
type Process = Free ProcessF 
data ProcessF a 
    = GetInput (String -> a) 
    | Dump String a 
    deriving (Functor) 
getInput :: Process String 
getInput = liftF $ GetInput id 
dump :: String -> Process() 
dump s = liftF $ Dump s() 

Basit eylem hem de aynıdır durumlarda, örneğin:

proc1 :: Process() 
proc1 = forever $ do 
    a <- getInput 
    b <- getInput 
    dump $ a ++ b 
    dump $ b ++ a 

Sorum şudur: Belli adımda bir devam diske seri hale şekilde süreci (PROC1) yorumlamak mümkün mü, bir sonraki program yürütülürken restore? Bir örnek verebilir misiniz lütfen?

Mümkün değilse, en yakın çözüm ne olurdu?

sonraki girdi kullanılabilir yalnızca Programı başlatmak istiyoruz

ardından, devamı girişi uygulamak yanındaki "getinput" ve çıkmak kadar yorumlamak.

Ben geçmeden önce aynı duruma sistemini almak için onları tekrar ardından, tüm girdileri günlüğe senaryo hayal olabilir, ancak bu durumda, günlük sınırı olmadan büyümek istiyorum. Sürecin karşılaştırılması mümkün olmadığından (EQ örneği yok) ve süreç sınırsız olduğundan, günlüğün tercümanın içine yerleştirilmesinin hiçbir yolunu bulamadım. Gördüğüm kadarıyla

+3

Böyle düşünmüyorum, (dağıtılmış bilgi işlem için bazı GHC özellerinin, — bunu yapabilmem mümkün olmasa da) sanmıyorum. En iyi standart yaklaşım muhtemelen, Haskell'in 'Monad' sınıfının, yorumlayabileceğiniz bazı soyut dilde işlevleri temsil eden kendi özel versiyonunuz için kolaylık ve genelliği ile ticaret yapmaktır. – dfeuer

cevap

5

, iki sorun vardır:

  • continuations keyfi veri tipleri

    içerebilir
  • işlevleri (yani kapanışları) içerebilir
  • continuations

Özellikle verilen İkinci kısıtlama, tam olaraktam olarak yapılmamaktadırne istiyorsun?

bir kütüphaneye Can Haskell functions be serialized? noktalarında tartışma packman çağırdı. Benioku:

... işlevsellik, programların belleğe alınması (farklı program çalışmalarında) ve seçili yerlerde denetim noktası yürütme işlemiyle en iyi duruma getirmek için kullanılabilir. Her iki kullanım da yukarıda bağlantılı slayt kümesinde örneklenmiştir.

(The slides bence, bahseder.)

bu yaklaşımın sınırlama olduğunu verilerin değil tüm türlü can (veya reddedilmesi gereken!) Seri hale getirilmek, özellikle değişken tipleri IORef, MVar gibi ve STM ile ilgili türler ve bazen bunlar çalışma zamanı istisnalarına neden olan eşyalar ve kapanışlarla sonuçlanır.Ayrıca, kitaplık, numaralı seri numaralı devamsızlığın, uygulamanız için gerçek bir sorun olabilecek veya oluşamayan numaralı aynı ikili tarafından ele alınmasına dayanır.

packman gibi sınırlı ve karmaşık bir yaklaşımla istediğiniz ya da daha fazlasını istediğiniz gibi elde edebilir ya da önem verdiğiniz tüm bilgileri toplayan özel bir diziden seri hale gelen kendi özel mantığınızı yazabilirsiniz.