2014-04-18 20 views
5

MonadState source code'a baktım, neden bu 3 fonksiyonun neden ölü döngüye girmeyeceğini anlamıyorum? Bu nasıl değerlendiriliyor? sınıfı bildiriminde get,put,state arasındaMonadState'e koyma ve durumu alma

class Monad m => MonadState s m | m -> s where 
    -- | Return the state from the internals of the monad. 
    get :: m s 
    get = state (\s -> (s, s)) 

    -- | Replace the state inside the monad. 
    put :: s -> m() 
    put s = state (\_ -> ((), s)) 

    -- | Embed a simple state action into the monad. 
    state :: (s -> (a, s)) -> m a 
    state f = do 
     s <- get 
     let ~(a, s') = f s 
     put s' 
     return a 
+0

Neticede 'let 'ifadesindeki' ~ 'ne yapar? – rafalio

+2

@radicality Kalıbı "reddedilemez" yapar. Ama aslında bu durumda hiçbir şey yapmıyor, çünkü izin veren bir düzen içindeki kalıplar zaten reddedilemez. Reddedilemez bir desen eşleşmesi, derleyiciye eşleşen kurucu hakkında doğru olduğunuzu söyler, böylece argümanlarından birinin değeri gerçekten zorlanana kadar yıkımı geciktirebilir. Kullanılan kurucu hakkında yanlış olsaydınız, o sırada bir istisna artırılacak, ancak daha önce değil. – Carl

cevap

6

tanımlar sınıfının gerçek durumlarda geçersiz anlamına varsayılan uygulamaları vardır. Bu şekilde, ölü döngü bozuk: Bir örnek yalnızca state'u tanımlarsa, get ve put sınıftaki varsayılan uygulamayı kullanarak tanımlanır. Benzer şekilde, bir örnek get ve put'u tanımlarsa, state varsayılan olarak uygulanır.

class Eq a where 
    (==) :: a -> a -> Bool 
    x == y = not (x /= y) 
    (/=) :: a -> a -> Bool 
    x /= y = not (x == y) 

instance Eq Bool where 
    True == True = True 
    False == False = True 
    _  == _  = False 
    -- the (/=) operator is automatically derived 
instance Eq() where 
    () /=() = False 
    -- the (==) operator is automatically derived 

Bir şey durumlarda yeniden sürece altına değerlendirmek varsayılan kendi kendine yönlendiren uygulamalar olması gerçekten yaygındır şu şekildedir:

Örneğin, Eq tip sınıfı tanımlanmış olabilir.

İlgili konular