Send Beginners mailing list submissions to
        beginners@haskell.org

To subscribe or unsubscribe via the World Wide Web, visit
        http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
        beginners-requ...@haskell.org

You can reach the person managing the list at
        beginners-ow...@haskell.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."


Today's Topics:

   1.  runState (liftM (+100) pop) [1, 2, 3,    4] (Example from LYH)
      (Olumide)
   2. Re:  runState (liftM (+100) pop) [1, 2, 3, 4] (Example from
      LYH) (Francesco Ariis)
   3.  Manipulate list, one element at a time (martin)
   4. Re:  Manipulate list, one element at a time (Frerich Raabe)


----------------------------------------------------------------------

Message: 1
Date: Tue, 24 Oct 2017 10:17:46 +0100
From: Olumide <50...@web.de>
To: beginners@haskell.org
Subject: [Haskell-beginners] runState (liftM (+100) pop) [1, 2, 3,      4]
        (Example from LYH)
Message-ID: <095d7fe8-6da4-f1ed-19f9-b7b879fbb...@web.de>
Content-Type: text/plain; charset=utf-8; format=flowed

Dear List,

Apologies for the awkward question title -- its the best I can do ATM. 
I'm still working my way through chapter 13 of LYH (title for a few 
monads more) and I came across the following two beasts

ghci> runState (liftM (+100) pop) [1,2,3,4]
(101,[2,3,4])
ghci> runState (fmap (+100) pop) [1,2,3,4]
(101,[2,3,4])
See 
http://learnyouahaskell.com/for-a-few-monads-more#useful-monadic-functions

Even though I'm still struggling to wrap my mind around monads, I sort 
of understand what's going on here. The problem is that I can't explain 
why the function (+100) is applied to _only_ the value 1 in (1,[2,3,4]).

Regards,

- Olumide


------------------------------

Message: 2
Date: Tue, 24 Oct 2017 11:32:53 +0200
From: Francesco Ariis <fa...@ariis.it>
To: beginners@haskell.org
Subject: Re: [Haskell-beginners] runState (liftM (+100) pop) [1, 2, 3,
        4] (Example from LYH)
Message-ID: <20171024093253.7ssjplja3bxlr...@x60s.casa>
Content-Type: text/plain; charset=us-ascii

On Tue, Oct 24, 2017 at 10:17:46AM +0100, Olumide wrote:
> ghci> runState (fmap (+100) pop) [1,2,3,4]
> (101,[2,3,4])
> 
> Even though I'm still struggling to wrap my mind around monads, I sort of
> understand what's going on here. The problem is that I can't explain why the
> function (+100) is applied to _only_ the value 1 in (1,[2,3,4]).

Hello Olumide,
    if we look at the instance of `fmap` for State we'll find (more or
less):

    fmap :: (a -> b) -> State s a -> State s b

So fmap modifies the *result*, not the *state* itself.

If we also recall that `State s a` is nothing but `\s -> (a, s)` then
it is easy to see that only the first element of the tuple (the
so called result, `a`) will be modified.

Does this clear your doubts?


------------------------------

Message: 3
Date: Tue, 24 Oct 2017 12:18:10 +0200
From: martin <martin.drautzb...@web.de>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <beginners@haskell.org>
Subject: [Haskell-beginners] Manipulate list, one element at a time
Message-ID: <59ef1362.1020...@web.de>
Content-Type: text/plain; charset=utf-8

Hello all,

How can I do something to each element of a list, but only modify one element 
at at time, so the result is a list of
lists, where each sublist is the original list with one element altered.

Something like

type Each a = (a->a) -> [a] -> [[a]]

I came up with:

each :: Each a
each f []     = []
each f (x:xs) = (f x : xs) : (map (x:) $  each f xs)

λ> each (*10) [1..3]
[[10,2,3],[1,20,3],[1,2,30]]


but I wonder if there is a more standard way of doing this


------------------------------

Message: 4
Date: Tue, 24 Oct 2017 12:59:57 +0200
From: Frerich Raabe <ra...@froglogic.com>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <beginners@haskell.org>
Subject: Re: [Haskell-beginners] Manipulate list, one element at a
        time
Message-ID: <8303af7029808d9b437e649409bec...@froglogic.com>
Content-Type: text/plain; charset=UTF-8; format=flowed

On 2017-10-24 12:18, martin wrote:
> How can I do something to each element of a list, but only modify one 
> element at at time, so the result is a list of
> lists, where each sublist is the original list with one element altered.
> 
> Something like

[..]

> λ> each (*10) [1..3]
> [[10,2,3],[1,20,3],[1,2,30]]

You could make use of the 'inits' and 'tails' functions from Data.List:

λ: inits [1..3]
[[],[1],[1,2],[1,2,3]]
λ: tails [1..3]
[[1,2,3],[2,3],[3],[]]

Using this, you could build a little list comprehension which takes every 
head and every tail and produces a list in which the two are concatenated, 
except that the first element of the tail has some function applied to it:

λ: let each f xs = [i ++ f t:ts | (i, t:ts) <- zip (inits xs) (tails xs)]
λ: :t each
each :: (a -> a) -> [a] -> [[a]]
λ: each (*10) [1..3]
[[10,2,3],[1,20,3],[1,2,30]]

-- 
Frerich Raabe - ra...@froglogic.com
www.froglogic.com - Multi-Platform GUI Testing


------------------------------

Subject: Digest Footer

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners


------------------------------

End of Beginners Digest, Vol 112, Issue 21
******************************************

Reply via email to