Problems with records and state monad (I'm a beginner)

thanks, pretty useful! But it doesn't work, maybe it's only a my silly error.

Couldn't match type ‘[Char]’
                  with ‘StateT VarState Data.Functor.Identity.Identity Name’
    Expected type: (VarState -> VarState)
                   -> (VarState -> VarState -> Name)
                   -> VarState
                   -> State VarState Name
      Actual type: (VarState -> VarState)
                   -> (VarState -> VarState -> Name) -> VarState -> Name
    In a stmt of a 'do' block: state <- get
    In the expression:
      do { state <- get;
           if (Map.member name (getEnvironment state)) then
               return name
           else
               do { put
                      (VarState
                         (getCounter state + 1)
                         (Map.insert
                            name (show (getCounter state)) (getEnvironment state)));
                    .... } }
    In an equation for ‘queryandupdate’:
        queryandupdate name
          = do { state <- get;
                 if (Map.member name (getEnvironment state)) then
                     return name
                 else
                     do { ... } }

With the code code:

queryandupdate :: Name -> VarState -> State VarState Name
queryandupdate name = do
  state <- get
  if  (Map.member name (getEnvironment state))
   then return name
   else do
    put (VarState (getCounter state +1)
                  (Map.insert name (show (getCounter state))
                              (getEnvironment state)))
    return $ show (getCounter state)

refreshing :: Expr -> State VarState Expr
refreshing expr =
 case expr of
  (Var n) -> do
   nome <- queryandupdate n
   return (Var nome)
  _ -> error "not implemented"

renamingFresh :: Expr -> Expr
renamingFresh e = evalState (refreshing e) emptystate
/r/haskellquestions Thread Parent