Haskell: State Monad -


i'm trying learn haskell. wrote code uses global state , can change using 2 functions (i.e. change1 , change 2). also, have included lens can learn too. problem last line of code. don't understand why cannot include 2 last lines in main. it'd run if remove either of them.

{-# language templatehaskell #-}  module dd (main, ma, change1,change2, dp(dp))  import control.lens import control.monad.state import control.monad.io.class (liftio)  data dp = dp {_sr  :: int , _fl :: int} deriving (show) makelenses ''dp  plus ::  dp  -> dp plus  = on (sr) (+90)  mult4 ::  dp  -> dp mult4 = on (fl) (*100)  change1 :: state dp () change1 = modify plus  change2 :: state dp ()  change2  = modify  mult4   ma :: state dp () ma  =        change1       change2   main =       runstate ma (dp 2 3)      evalstate ma (dp 2 3)-- here problem 

edit: i'm bit confused: why below code runs without error?

data dp = dp {_sr  :: int , _fl :: int} deriving (show)  makelenses ''dp gs :: statet dp io int gs =  d <- gets _sr liftio $ print (d) dd<- uses sr (10<=) if (dd)              return (10)             else return (90)  main  =           runstatet gs (dp 3 6)         evalstatet gs (dp 3 6) 

in case do-notation syntactic sugar for

(runstate ma (dp 2 3)) >> (evalstate ma (dp 2 3)) 

the type of (>>) monad m => m -> m b -> m b means runstate ma (dp 2 3) , evalstate ma (dp 2 3) must in same monad, not

but code doesn't work reason. function main has following type annotation: main :: io a means main expects action performed in (for example printing results)

main :: io () main =   print $ runstate ma (dp 2 3)   print $ evalstate ma (dp 2 3) 

that works, because

  • type of print $ runstate ma (dp 2 3) io ((), dp)
  • type of print $ evalstate ma (dp 2 3) io ()

hence, inferred type >> io ((), dp) -> io () -> io () doesn't violate monad m => m -> m b -> m b. , resulting type io () suits main :: io a


Comments

Popular posts from this blog

node.js - Node js - Trying to send POST request, but it is not loading javascript content -

javascript - Replicate keyboard event with html button -

javascript - Web audio api 5.1 surround example not working in firefox -