[Haskell-cafe] Haskell Data Structure design

Guru Devanla gurudev.devanla at gmail.com
Sat Jul 9 17:10:26 UTC 2016


Say, in the above example, I want to add up values returned by
`student_totalFeesOwed`  by using foldM operation.  Is it possible?

For example, here is an expression I have

L.foldr (\a  b->  (evalState (student_totalFeesOwed a) $ env) + b) 0
[(RowId 1), (RowId 2)]

On Sat, Jul 9, 2016 at 9:15 AM, Will Yager <will.yager at gmail.com> wrote:

> I did the same thing when I was learning to generalize my understanding of
> monads! Very common mistake.
>
> I'm not sure I understand your question about #3. Can you give an example
> using evalState? We'll tell you if you can do it without evalState.
>
> I suspect you want something like
>
> "mapM_ addStudentFee students"
>
> Will
>
> On Jul 9, 2016, at 00:56, Guru Devanla <gurudev.devanla at gmail.com> wrote:
>
> William/Tom,
>
> (1)  Yes, looking into lens and re-factoring my current experimental
> project in lens will be my next iteration. For now, I plan not to spend
> time on it.
>
> (2)  Agreed.  Not sure how I missed that.
>
> (3) I see how foldM works now.  I missed the point that foldM not only is
> a `map` but also does a `sequence` after that.  I got stuck earlier,
> thinking I will end up with a list of state monads. The sequence steps
> executes this monadic action.
>
> But, how can I do a foldM in a state monad. Say, I need to map over a list
> of students and add up all their fees, can I get away not `evalState`
> inside the foldM step function?
>
> Thanks. this is very exciting as I keep simplifying my code!
>
> Guru
>
>
>
>
> On Fri, Jul 8, 2016 at 7:55 PM, <amindfv at gmail.com> wrote:
>
>>
>> On Fri, Jul 8, 2016 at 9:57 PM, Guru Devanla <gurudev.devanla at gmail.com>
>>  wrote:
>>
>>
>> 1.  I see that almost in every function I deal with state, I have e <-
>>> get , expression in the begining. I always ending up having to use the
>>> state to query for different values. I guess this is OK.
>>>
>>
>> El 8 jul 2016, a las 22:07, William Yager <will.yager at gmail.com>
>> escribió:
>>
>> For #1, look into using the Lens library's support for the State monad.
>> You can often avoid doing a get, and instead write things like `fees += 5`,
>> which will add 5 to the field in the state called "fees".
>>
>>
>> Lens is a pretty heavy extra thing for a beginner to have to learn --
>> you'll do fine with the 'modify' function:
>>
>> modify :: (s -> s) -> State s ()
>>
>> So instead of writing:
>>
>> do
>>    s <- get
>>    put (s + 5)
>>
>> You say:
>>
>> modify (+5)
>>
>>
>> Tom
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20160709/9fcdf34d/attachment.html>


More information about the Haskell-Cafe mailing list