haskell - State Monad ExampleProblem -



haskell - State Monad ExampleProblem -

i working on problem , had asked related question. implementation of state monad farther refine code tried implement using 1 increment function.

module stateexample import control.monad.state info globstate = globstate { c1 :: int, c2:: int, c3:: int} deriving (show) newglobstate:: globstate newglobstate = globstate { c1=0,c2=0,c3=0 } incr :: string-> state globstate () incr x = modify(\g -> g {x =x g + 1}) main:: io() main = allow a1= flip execstate newglobstate $ incr c1 incr c2 incr c1 print

but here getting error

`x' not (visible) constructor field name

how can remove error?

you have nail weakness in haskell: records not first class values! indeed, nice write have done, not possible. however, can utilize different libraries accomplish desired effect. how looks if utilize fclabels:

{-# language templatehaskell, typeoperators #-} module stateexample import control.monad.state hiding (modify) import data.label (mklabels) import data.label.pure ((:->)) import data.label.purem info globstate = globstate { _c1 :: int , _c2 :: int , _c3 :: int } deriving show $(mklabels [''globstate]) newglobstate:: globstate newglobstate = globstate { _c1 = 0, _c2 = 0, _c3 = 0 } incr :: (globstate :-> int) -> state globstate () incr x = modify x (+1) main :: io () main = allow = flip execstate newglobstate $ incr c1 incr c2 incr c1 print

there magic parts here. define globstate same record names prependend underscore. function mklabels uses templatehaskell define "lenses" every field in record. these lenses have same name without underscore. argument (globstate :-> int) incr such lens, , can utilize modify function data.label.purem updates records defined way within state monad. hide modify control.monad.state, avoid collision.

you can @ other functions in documentation purem other functions usable state monads, gets , puts.

if not have fclabels installed, have cabal executable cabal-install bundle (which if install haskell platform), can install fclabels running:

cabal install fclabels

if first time run cabal, first need update database:

cabal update

haskell

Comments

Popular posts from this blog

How do I check if an insert was successful with MySQLdb in Python? -

delphi - blogger via idHTTP : error 400 bad request -

postgresql - ERROR: operator is not unique: unknown + unknown -