5

Genel olarak bu tutorial'u takip ederek devam etmeyi anlamaya çalışıyorum.Durum Monadının CPS sürümünde nasıl çalışır?

Ancak, bölüm 2.10 aşağıdaki örnek anlamak için güçlük çekiyorum:

# let get() = 
    shift (fun k -> fun state -> k state state) ;; 
get : unit => ’a = <fun> 

state

tip herhalde int taşımaktadır. Ne anlamadığım k türüdür. benim anlayışıma göre, k tüm hesaplama get() sonra sonradan gelir yakalar ve bir devlet monad bahsediyoruz çünkü k dolayısıyla

k : int => 'a 

ama bir int alarak devam edilecektir bir hesaplama temsil etmek mantıklıdır kod, o kadar da görünmüyor ve aslında ima ikinci kez, için state alır:

k : int => int => 'a 

ama ikincisi nereden geldiğini alamadım ve hangi get anlamda olduğunu unit => int => 'a yerine unit => 'a yazın?

gerçek durum tek hücreli uygulama ile karşılaştırıldığında, konfüzyon daha ekler:

newtype StateT s m a = StateT { runStateT :: s -> m (a,s) } 

yani durum geçiş ilk anlayış ile eşleşen sonucu ve bir devlet tuple, devlete bir fonksiyonu olarak temsil edilir.

Herhangi biri yol gösterebilir mi?

İkinci olarak, Haskell'in Control.Monad.Trans.Cont'u kullanarak burada get'u nasıl uygulamalıyım? Tip sistemini rahatlatan problemler yaşıyorum.


GÜNCELLEME Ben ikinci bir tane var gibi görünüyor

:

Prelude Control.Monad.Trans.Cont> let get() = shift $ \k -> return $ \i -> k i i 

Ama devamında iki kez devlet uygulamak gerekir neden hala alamadım.

+0

@Bergi, aslında OchaCaml olarak adlandırılmaktadır. Öğreticiyi takip ediyorum ama kullanımda olan dillerin bu durumda kavramın anlaşılmasını etkilemediğini düşünmüyorum. – HuStmpHrrr

cevap

3

Sen state üzerinde k uygulamak iki kez İlki get() sonucu ikincisi sonra devlet geçirerek karşılık (biz get 'ın etkisi mevcut durumunu alma ve sonuç olarak iade olmak istiyorum) tekabül çünkü get (get'un durumu değiştirmediğinden, get'dan önceki durumla aynıdır) bir sonraki durum hesaplamasına gider. Diğer bir deyişle,

, durum tek hücreli State s a ~ s -> (a, s) olduğu, kendi CPS sürüm State s r a ~ s -> (a -> s -> r) -> r ve böylece get : State s s için, a ~ s için, devam tip s -> s -> r bir fonksiyonu olacaktır.

+0

bu benim elde edemediğim ana bölüm. Mevcut durumu zaten geçirerek devam etmek yeterli midir?Ayrıca devlet monad versiyonundan cps versiyonuna nasıl adım attığımı anlamıyorum. – HuStmpHrrr

+0

Ayrıca, sadece kod bakarak devam türünü nasıl bilebilirim? hangi kısımda bakmalıyım, delik mi delik mi değil mi? – HuStmpHrrr

+0

Eğer 'get' sonucunun mevcut durum + 1 olması gerektiğine (örnek için "State Int" 'e sabitlenmesi) ne gerektiğini düşünün. Sonraki durum hala gelen durumla aynı olurdu, ancak sonuç farklı olurdu. Bu yüzden, sonuç argümanı olarak 'state + 1' ve devamın yeni durum argümanı olarak 'state'i geçmeniz gerekiyordu. – Cactus