[Haskell-cafe] Accumulating and threading output of functions

MigMit miguelimo38 at yandex.ru
Sat Jun 4 16:52:54 UTC 2016


First of all: where does your first argument (`a`) come from? Is it the same for all of those functions?

If so, you can get rid of it by using `map ($ a)`.

Now, you have a list of functions of type `b -> (b, c)`. The most natural thing here is to convert them to the State monad: `State b c`. And your original functions would be `a -> State b c`. Try to use State monad from the start.

Then, from the list of type `[State b c]`, the `sequence` function gives you `State b [c]` instead. `evalState` would give you just `[c]`, and you can convert the list of `c`s into a single `c` in any way you want.

> On 04 Jun 2016, at 17:18, martin <martin.drautzburg at web.de> wrote:
> 
> Hello all,
> 
> I have a number of functions, whose type is something like this:
> 
> f:: a -> b -> (b, c)
> 
> i.e. it returns a modified b and an additional c.
> 
> Now I want to write a combinator, which assembles a list of such functions into a single one. This combinator will have
> to thread the bs from one function to the next and accumulate the cs into a single c.
> 
> While I was able to write this using a fold, I am not happy with it (my first attempt had a bad error in it, which is
> always a bad sign).
> 
> Are you aware of any idioms, how to do such things on the beaten track?
> 
> 
> 
> 
> 
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe



More information about the Haskell-Cafe mailing list