<div dir="ltr"><div class="gmail_quote"><div dir="ltr"><div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Hello,</span><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoration-style:initial;text-decoration-color:initial"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoration-style:initial;text-decoration-color:initial">I am a beginner with Haskell and the last few days I am troubled on how to form a stack of Monad Transformers. </div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoration-style:initial;text-decoration-color:initial">The following example demonstrates the use of multiple State monads without the use of Monad Transformers:</div></div><div><br></div><div>data Item = Item { rCounter :: Int }</div><div><br></div><div>increaseCounter :: State Item ()</div><div>increaseCounter = do</div><div>  val <- gets rCounter</div><div>  modify (\i -> i { rCounter = val + 1 })</div><div><br></div><div>data ItemManager = ItemManager { rItems :: [Item] }</div><div><br></div><div>addItem :: Item -> State ItemManager ()</div><div>addItem item = do</div><div>  items <- gets rItems</div><div>  modify (\mgr -> mgr { rItems = items ++ [item] })</div><div><br></div><div>increaseCounterInItems :: State ItemManager ()</div><div>increaseCounterInItems = do</div><div>  items <- gets rItems</div><div>  let items' = map <b>(<font color="#ff0000">execState increaseCounter</font>)</b> items</div><div>  modify (\mgr -> mgr { rItems = items' })</div><div><br></div><div>main :: IO ()</div><div>main = $ do</div><div>  let itemMgrState = do</div><div>        addItem $ Item 0</div><div>        addItem $ Item 10</div><div>        increaseCounterInItems</div><div><br></div><div>  let itemMgr = execState itemMgrState $ ItemManager []</div><div><br></div><div>  let items = rItems itemMgr</div><div>  putStrLn rCounter (items !! 0) -- prints 1</div><div>  putStrLn rCounter (items !! 1) -- prints 11</div></div><div><br></div><div>In the above implementation calls <b><font color="#ff0000">execState</font><font color="#000000">,</font><font color="#ff0000"> </font></b>inside functions of ItemManager, for updating Items. </div><div>I have read about MonadTransformers and that they give you the ability to use monads inside the context of another monad.</div><div>So I would like to use StateT in signatures of ItemManager's functions and avoid calling <b style="color:rgb(255,0,0)">execState, </b><font color="#000000">something</font> like this:</div><div>

<br class="m_-5826819471182298913gmail-Apple-interchange-newline"><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">increaseCounterInltems :: StateT ItemManager (State Item) ()</span>

<br></div><div><br></div><div>But I cannot find a way to implement the above function. The root cause of the difficulty seems to be that ItemManager contains multiple Items. </div><div>The Monad Transformer stack contains a single State Item. So it seems to me that I am following the wrong approach.</div><div><br></div><div>How could I use Monad Transformers in order to avoid calling <b style="color:rgb(255,0,0)">execState</b><font color="#000000"> for modifying Items in ItemManager?</font></div><div><div><br></div><div>Thanks in advance,</div><div>Leonidas</div></div></div><div id="m_-5826819471182298913DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2"><br>
<table style="border-top:1px solid #d3d4de">
        <tbody><tr>
        <td style="width:55px;padding-top:13px"><a href="https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail&utm_term=icon" target="_blank"><img src="https://ipmcdn.avast.com/images/icons/icon-envelope-tick-round-orange-animated-no-repeat-v1.gif" alt="" width="46" height="29" style="width:46px;height:29px"></a></td>
                <td style="width:470px;padding-top:12px;color:#41424e;font-size:13px;font-family:Arial,Helvetica,sans-serif;line-height:18px">Virus-free. <a href="https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail&utm_term=link" style="color:#4453ea" target="_blank">www.avast.com</a>
                </td>
        </tr>
</tbody></table><a href="#m_-5826819471182298913_DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2" width="1" height="1"></a></div>
</div><br></div>