2014-06-08 21 views
12

Haskell eyaleti monadları üzerine birkaç öğretici okuduktan sonra bunları kendim denemek istedim. Ben Control.Monad.State aşağıdaki tanımlamayı sağlayan iddia okumak öğreticiler: Ben de bir Hoogle çalıştı'Durum' için veri kurucu nerede?

Prelude> import Control.Monad.State 
Prelude Control.Monad.State> :t State 

<interactive>:1:1: 
    Not in scope: data constructor `State' 
    Perhaps you meant `StateT' (imported from Control.Monad.State) 

: Ancak

newtype State s a = State { runState :: s -> (a,s) } 

, ben sorun State veri yapıcısı bulmak zorunda gibi görünüyor State için arama yapın, ancak beklenen türle herhangi bir veri kurucusu bulamadınız.

State yapıcısı nereye gitti? Hiç var mıydı? Yoksa sadece yanlış yere mi bakıyorum? Esasen bir devlet monayı yaratmak için ne yapmam gerektiğini bilmek istiyorum.

cevap

20

içinde güncel değil state işlevini kullanabilirsiniz web bu konuda modası geçmiş

bir değer oluşturmak için, sadece state işlevini kullanabilirsiniz.

state :: (s -> (a, s)) -> State s a 

Eskiden State alanı olan, şimdi sadece normal bir işlevdir, ancak daha önce olduğu gibi çalışır.

StateStateT monad transformatör açısından yeniden yazılmıştır

:

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

tek fark:

type State s = StateT s Identity 

StateT kendisi fonksiyonları çok benzer şekilde eski State kurucusuna bir yapıcı StateT sahiptir m ek parametresi vardır. Bu, başka bir takıma ekleyebileceğiniz bir yuvadır. Bu, StateT'un daha sonra durum işleme yetenekleriyle genişletilir. Doğal olarak, State'un eski işlevselliğini yeniden kazanmak için, m'u Identity'a ayarlamanız yeterlidir, bu hiçbir şey yapmaz.

newtype Identity a = Identity { runIdentity :: a } 
9

Bir süre önce MTL her monad ve trafo için mantığını çoğaltmak zorunda aksi beri

type State s = StateT s Identity 

için

newtype State s a = State ... 

geçti. Bunun yerine artık Bu artık. Ne yazık ki, bu konuda birçok Haskell kaynaklarını yapar yoksa

state :: (s -> (a, s)) -> State s a 

Ne yazık ki RWH ve LYAH hem bu açıdan :(

İlgili konular