<div dir="ltr"><div><div><div><div><div><div><div><div>Hi Leonidas<br><br></div>This is an interesting example. If I understand you correctly, what you want to do is to focus on one particular item, apply a (State) monadic computation that modifies it, replace that in the main list, as part of a larger monadic computation (also in a State monad / StateT transformer).<br><br></div>The first part, focusing on a sub-element, is fine. You could have an operation on a State monad that allows you to focus on a substate. But the problem is merging the result back into the main state: that would not happen automatically.<br><br></div>(Note for other readers: reminds me of lenses. Maybe StateT and Lens can be combined?)<br><br></div>It seems to me that, in this case, what you are already doing would be roughly the way to do it (if you want to use State also to modify the inner items).<br><br></div>Example of state transformers:<br><br></div>Imagine that you have an additional, distinguished Item, that you need to keep apart (apart is the keyword, not the fact that it's only one).<br><br></div>Then the monad you would be handling would be like:<br><br></div><div>State (ItemManager, Item)<br><br></div><div>No matter how many Items you have in the ItemManager (may be zero), you always have a distinguished Item separated.<br></div><div><br></div><div>But that means that, to manipulate this, you'd have to extract the ItemManager, modify it, put it back in the tuple, etc. So, you can also do:<br><br></div><div>StateT ItemManager (State Item)<br><br></div><div>Which means that you can modify ItemManager and Item independently, and manipulate both with:<br><br></div><div>op :: StateT ItemManager (State Item) ()<br></div><div>op = do<br></div><div>  modify f           -- computation that affects item manager<br></div><div>  lift (modify g)   -- computation that affects single item<br>  ...<br><br></div><div>You would then define your operations to be more flexible:<br><br>increaseCounterInItems :: StateT ItemManager m ()<br><div><br></div><div>So, you could also do:<br></div></div><div><br><div>op :: StateT ItemManager (State Item) ()<br></div><div>op = do<br></div><div>  increaseCounterIntItems     -- adds one to every Item in ItemManager<br>  lift increaseCounter          -- adds one to the single Item<br>  ...<br></div><br></div><div>Hope that helps<br><br></div><div>Best wishes<br><br></div><div>Ivan<br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 6 March 2018 at 17:46, leonidasbo . <span dir="ltr"><<a href="mailto:leonidasbo@gmail.com" target="_blank">leonidasbo@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><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_8570978510949558714m_-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_8570978510949558714m_-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 alt="" style="width:46px;height:29px" width="46" height="29"></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_8570978510949558714_m_-5826819471182298913_DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2" width="1" height="1"></a></div>
</div><br></div>
<br>______________________________<wbr>_________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/haskell-<wbr>cafe</a><br>
Only members subscribed via the mailman list are allowed to post.<br></blockquote></div><br></div>