Re: [Haskell-cafe] Haskell Data Structure design

I believe you could use foldM (\sum student -> (sum +) <$> totalFeesOwed student) 0 students Will
On Jul 9, 2016, at 15:09, Guru Devanla
wrote: OK. Thank you. That is what I ended up doing after I understood how mapM worked. But, since I was going through 2 steps, I was wondering if using foldM directly was possible in this case.
On Sat, Jul 9, 2016 at 11:25 AM, Will Yager
wrote: fees <- mapM totalFeesOwed students let total = sum fees You can use a fold instead of sum if you want.
Will
On Jul 9, 2016, at 13:10, Guru Devanla
wrote: 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
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
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,
wrote: > On Fri, Jul 8, 2016 at 9:57 PM, Guru Devanla
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
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

That is a nice trick! Thanks
On Jul 9, 2016 1:22 PM, "Will Yager"
I believe you could use
foldM (\sum student -> (sum +) <$> totalFeesOwed student) 0 students
Will
On Jul 9, 2016, at 15:09, Guru Devanla
wrote: OK. Thank you. That is what I ended up doing after I understood how mapM worked. But, since I was going through 2 steps, I was wondering if using foldM directly was possible in this case.
On Sat, Jul 9, 2016 at 11:25 AM, Will Yager
wrote: fees <- mapM totalFeesOwed students let total = sum fees
You can use a fold instead of sum if you want.
Will
On Jul 9, 2016, at 13:10, Guru Devanla
wrote: 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
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
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,
wrote: On Fri, Jul 8, 2016 at 9:57 PM, Guru Devanla
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
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
participants (2)
-
Guru Devanla
-
Will Yager