2010-04-04 9 views
12

Czytam rozdział Monady w świecie rzeczywistym Haskell (rozdział 14). Funkcja jest defined następująco:Powód pobierania i wkładania MonadState?

type RandomState a = State StdGen a 
getRandom :: Random a => RandomState a 
getRandom = 
    get >>= \gen -> 
    let (val, gen')= random gen in 
    put gen' >> 
    return val 

ja naprawdę nie rozumiem cel zdobyć i umieścić tutaj funkcje. przepisałem funkcję w następujący sposób, który wydaje się robić to samo i jest bardziej zwięzły:

getRandom2 :: Random a => RandomState a 
getRandom2= State $ \ s -> random s 

Więc moje pytanie brzmi: Co jest celem uzyskania i umieścić w ogóle?

+1

Tylko w tym przypadku, lub w celu "get" i "put" w ogóle? Ich użycie może być łatwiej wyjaśnione w tym drugim przypadku ... – kennytm

+0

Ogólnie; Będę edytować moje pytanie. – CiscoIPPhone

Odpowiedz

12

To trochę zbieg okoliczności, że random zdarza się mieć dokładnie ten sam typ podpis/Wykorzystanie wzorca jako wewnętrznej funkcji State monady (i rzeczywiście w tym przypadku można być jeszcze bardziej zwięzły, czy może bardziej skomplikowane, z getRandom2 = State random).

Jednak, ogólnie rzecz biorąc, nie będą one miały zastosowania, a następnie get i put są wygodnymi elementami hydraulicznymi, których znaczenie jest być może wyraźniejsze niż bezpośrednie zapisywanie funkcji wewnętrznej. Pomagają również w abstrakcji z dokładnej reprezentacji używanej przez State - są to w rzeczywistości członkowie klasy bardziej ogólnej klasy MonadState, dzięki czemu można napisać bardziej polimorficzny kod za pomocą ich.

+0

Mam jeszcze jedno pytanie - jak * umieścić * zachować nowy stan do następnego połączenia? Wynik * put * jest ignorowany, nie mogę tego rozgryźć. Proszę pomóż mi. Dzięki. –

+0

To część wewnętrznej instalacji monady 'State'. Monadyczne wyjście 'put' ma typ'() ', aby wskazać, że nie jest to użyteczna wartość. –

+0

Thx za odpowiedź. Ale nie w pełni rozumiem. Czy to oznacza, że ​​* put * ma jakiś efekt uboczny? Czy możesz wyjaśnić, jak przechowuje nowy stan? Dzięki. –

Powiązane problemy