Links und Funktionen
Sprachumschaltung

Navigationspfad
Sie sind hier: Startseite / Lehre / SS 2013 / Einführung in die Funktionale Programmierung / EFP Material / Code Vorlesung Monaden Teil 2


Inhaltsbereich

Code Vorlesung Monaden Teil 2

Beispiel: Zustandsmonade zu Fuss

Haskell source code icon MonadenTeil2.hs — Haskell source code, 1 KB (2011 bytes)

Dateiinhalt

data Kontext = Kontext {x,y,z :: Int}
  deriving Show

{-
data Kontext = Kontext Int Int Int 

x :: Kontext -> Int
x (Kontext x _ _ ) = x

y :: Kontext -> Int
y (Kontext _ y _ ) = y

z :: Kontext -> Int
z (Kontext _ _ z ) = z
-}

newtype State a = State (Kontext -> (a,Kontext))

instance Monad State where
  return x = State $ \k -> (x,k)
  
  -- State a -> (a -> State b) -> State b
  (>>=) berechnung f = State $ \k0 -> 
                        let (State b1)     = berechnung
                            (ergebnis,k1)  = b1 k0
                            (State b2)     = f ergebnis
                            (ergebnis2,k2) = b2 k1
                        in  (ergebnis2,k2)


runState :: State a -> Kontext -> (a,Kontext)
runState (State b) k0 = b k0
                        
getKontext :: State Kontext
getKontext = State $ \k0 -> (k0,k0)

putKontext :: Kontext -> State ()
putKontext z = State (\k0 -> ( () , z ))

modifyKontext :: (Kontext -> Kontext) -> State ()
modifyKontext zt = State $ \k0 -> ((), zt k0 ) 

modifyKontext' :: (Kontext -> Kontext) -> State ()
modifyKontext' zt = do
                      ktxt <- getKontext
                      putKontext $ zt ktxt

putY :: Int -> State ()
putY y = modifyKontext $ \(Kontext x _ z)-> Kontext x y z


incX :: State ()
incX = modifyKontext modX
  where
    modX :: Kontext -> Kontext
    modX (Kontext x y z) = Kontext (x+1) y z    
    
incZ :: State ()
incZ = modifyKontext modZ
  where
    modZ :: Kontext -> Kontext
    modZ k = k { z=succ $ z k }


-- increment1 :: State ()
-- increment1 = State $ \k0 -> ((), k0 + 1)
-- 
-- increment2 :: State ()
-- increment2 = do
--     k <- getKontext
--     putKontext (k + 1)
--     
-- increment3 :: State ()
-- increment3 = modifyKontext (\x->x+1)  -- als Section geschrieben (+1)
-- 
-- demo :: State Kontext
-- demo = do
--   putKontext 42
--   increment1
--   increment2
--   increment3
--   getKontext
--   

demo2 :: State Int
demo2 = do
  incX
  incZ
  k <- getKontext
  return $ (y k) * 2
  

Artikelaktionen

abgelegt unter:

Funktionsleiste