Send Beginners mailing list submissions to
        beginners@haskell.org

To subscribe or unsubscribe via the World Wide Web, visit
        http://www.haskell.org/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. Re:  Implementing a Local Propagation Network
      (Stephen Blackheath [to Haskell-Beginners])
   2.  How to model this in haskell,    get rid of my OO thinking?
      (hask...@lonely-star.org)
   3.  Are monads pure? (Amy de Buitl?ir)
   4. Re:  How to model this in haskell,        get rid of      my OO thinking?
      (Isaac Dupree)
   5. Re:  Are monads pure? (aditya siram)
   6. Re:  Are monads pure? (Amy de Buitl?ir)
   7. Re:  Are monads pure? (Andres Loeh)
   8. Re:  Are monads pure? (Stephen Tetley)


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

Message: 1
Date: Tue, 18 May 2010 14:41:09 +1200
From: "Stephen Blackheath [to Haskell-Beginners]"
        <mutilating.cauliflowers.step...@blacksapphire.com>
Subject: Re: [Haskell-beginners] Implementing a Local Propagation
        Network
To: beginners@haskell.org
Message-ID: <4bf1fe45.8050...@blacksapphire.com>
Content-Type: text/plain; charset=UTF-8

Patrick,

If you want to implement it in a functional style, you have to use an
association map of some sort.  Haskell only has values, but not any
concept of a reference (unless you count things like IORef, but I am not
counting those).  Generally speaking this is needed whenever you are
dealing with a data structure that has cycles.  (Generally speaking
because it's possible to make data structures lazily refer to themselves.)

People usually use IntMap, but there's a new package EnumMap on Hackage
which is really powerful.  It's like IntMap only typesafe.  You will
need a counter in your data structure as a source of unique ids.  You
can also use value-supply (from Hackage), which is a great bit of code.

On the face of it, this seems cumbersome, but the way to do it is to
create a data structure and access it through accessor functions like
"add node", "delete node", "follow wire", etc.  This way you can
abstract those details away.  People have done various directed/undirect
graph packages and so on on Hackage - I can't recommend anything.

Stick with it - this approach does work.  I've done things like
conversion of 3D models into triangle strips using this method, with
very satisfying results.


Steve

On 18/05/10 12:59, Patrick LeBoutillier wrote:
> Hi all,
> 
> After learning some Haskell recently, I decided to revisit a book
> about functional programming techniques for Perl: Higher Order Perl. I
> didn't fully understand the book at the time but now my Haskell
> experience has proved to be very insightful.
> 
> Towards the end of the book the author implements a local propagation network.
> 
> Here is the Perl source code:
> http://hop.perl.plover.com/Examples/Chap9/Local-Propagation/
> The PDF of the specific chapter is here:
> http://hop.perl.plover.com/book/pdf/09DeclarativeProgramming.pdf
> 
> I would like to experiment with something similar in Haskell, but the
> way this network is designed is all about state and references:
> 
> - Wires have a values that can change over time;
> - Wires have references to nodes;
> - Nodes have references to wires;
> 
> I'm a bit stuck as to how to approach the "object has a list
> references to other objects" situation from Haskell. I tried this:
> 
> type Name = String
> data Node = Node Name [Wire]
> data Wire = Wire Name Node Double [Node]
> 
> But that doesn't seem like it would work since when I change a Wire I
> must find all "copies" of it (in the Node objects) and update them
> also. Perhaps I should just refer to Wires/Nodes by name and use an
> association list to lookup them up, but that seems cumbersome.
> 
> Anybody have any suggestions?
> 
> 
> Thanks a lot,
> 
> Patrick
> 
> 
> 


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

Message: 2
Date: Mon, 17 May 2010 23:21:38 -0400
From: hask...@lonely-star.org
Subject: [Haskell-beginners] How to model this in haskell,      get rid of
        my OO thinking?
To: Biginners Haskell Mailinglist <beginners@haskell.org>
Message-ID: <20100517232138.6a5da...@samzwo>
Content-Type: text/plain; charset=US-ASCII

Hi,

I learning haskell and I am trying to understand how model certain
things in it.
As I have been doing a lot of C++ programming so far. Let's imagine we
want to write a game. In the game there are spaceships and rocks (image
something like astroids :) ). Now both spaceships and rocks have a
position and can move. Spaceships can shoot, while rocks can explode.
In C++, I would do (simplified):

class ScreenObject
{
   float x,y;
   void move(dx,dy){x+=dx;y+=dy;}
};

class Spaceship : public ScreenObject
{
    void shoot(){...}
};

class Rocket : public ScreenObject
{
    void explode(){...}
};

But what would I do in haskell? Ok, I can define a typeclass
"ScreenObjectType" that has a move function (taking an object, retuning
an moved object).
But I do not want to implement "move" for both Spaceship and Rocket.
Can I somehow give a default implementation for move that works on any
datatype having an "x" and "y" element? Or what would I do?
Can I somehow define a "base datatype" holding a x and y member form
which Spaceship and Rocket derive?
I feel like I am thinking to much OOP here.
But the point is, I guess, that I want to avoid code duplication!

So I guess, it comes down to the questions: How would you model the
scenario described above in haskell?

Thanks!
Nathan


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

Message: 3
Date: Tue, 18 May 2010 04:28:45 +0100
From: Amy de Buitl?ir <a...@nualeargais.ie>
Subject: [Haskell-beginners] Are monads pure?
To: beginners <beginners@haskell.org>
Message-ID:
        <aanlktimx-iwy6kyzbtt3t2o4yu7rddcabe8qdn0dq...@mail.gmail.com>
Content-Type: text/plain; charset="iso-8859-1"

When I first started learning Haskell, I was under the impression that
monads provided a way to encapsulate some imperative code so it didn't
"contaminate" your functional code. But I think that's a misconception that
I got because the first monad I dealt with was IO. Lately I've been reading
more about monads, and (aside from IO), they are purely functional, aren't
they? If they have state, they deal with it in a purely functional way.
Behind the scenes, they thread the state through your computations so that
you don't you don't have to bother with it. Is that correct? TIA.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
http://www.haskell.org/pipermail/beginners/attachments/20100517/0e7d558e/attachment-0001.html

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

Message: 4
Date: Mon, 17 May 2010 23:31:56 -0400
From: Isaac Dupree <m...@isaac.cedarswampstudios.org>
Subject: Re: [Haskell-beginners] How to model this in haskell,  get rid
        of      my OO thinking?
To: hask...@lonely-star.org
Cc: Beginners@haskell.org
Message-ID: <4bf20a2c.9030...@isaac.cedarswampstudios.org>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed

On 05/17/10 23:21, hask...@lonely-star.org wrote:
> So I guess, it comes down to the questions: How would you model the
> scenario described above in haskell?

how about,

data Position = Position { positionX :: Float, positionY :: Float }

move :: Position -> (Float, Float) -> Position

data Spaceship = Spaceship Position ...other data members...
data Rocket = Rocket Position ...other data members...
(or perhaps not separate data-types but rather
data SpaceThing =
    Spaceship { spacePosition :: Position, ...other data members...}
  | Rocket { spacePosition :: Position, ...other data members...}
  ...

-- this latter has advantages and disadvantages regarding code reuse and 
code reliability.  Experiment!


-Isaac


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

Message: 5
Date: Mon, 17 May 2010 23:43:48 -0400
From: aditya siram <aditya.si...@gmail.com>
Subject: Re: [Haskell-beginners] Are monads pure?
To: Amy de Buitl?ir <a...@nualeargais.ie>
Cc: beginners <beginners@haskell.org>
Message-ID:
        <aanlktinu3wd9lptv-y5rcgeo_1rzwvuysyaqadi9t...@mail.gmail.com>
Content-Type: text/plain; charset=ISO-8859-1

Threading state is something that the State monad does and it is
purely functional - showing that a monad *can* be pure but don't have
to be. Other monads, like IO as you have stated, have side effects.

At the end of the day I found that the monad is very, very general and
it's best way to think about it as a piece of data wrapped in some
type. With a monad you can
1. takes some data and wraps it up in a type (return) :
a -> m a
2. apply a function to the data within the type (>>=).
m a -> (a -> m b) -> m b

hth,
-deech


On 5/17/10, Amy de Buitléir <a...@nualeargais.ie> wrote:
> When I first started learning Haskell, I was under the impression that
> monads provided a way to encapsulate some imperative code so it didn't
> "contaminate" your functional code. But I think that's a misconception that
> I got because the first monad I dealt with was IO. Lately I've been reading
> more about monads, and (aside from IO), they are purely functional, aren't
> they? If they have state, they deal with it in a purely functional way.
> Behind the scenes, they thread the state through your computations so that
> you don't you don't have to bother with it. Is that correct? TIA.
>


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

Message: 6
Date: Tue, 18 May 2010 05:37:20 +0100
From: Amy de Buitl?ir <a...@nualeargais.ie>
Subject: Re: [Haskell-beginners] Are monads pure?
Cc: beginners <beginners@haskell.org>
Message-ID:
        <aanlktimzdqxwjz-mp1znpzskvkamvrjjlsn_6xwzp...@mail.gmail.com>
Content-Type: text/plain; charset="iso-8859-1"

Threading state is something that the State monad does and it is

> purely functional - showing that a monad *can* be pure but don't have
> to be. Other monads, like IO as you have stated, have side effects.
>

Thank you, that helps.


> At the end of the day I found that the monad is very, very general and
> it's best way to think about it as a piece of data wrapped in some
> type. With a monad you can
> 1. takes some data and wraps it up in a type (return) :
> a -> m a
> 2. apply a function to the data within the type (>>=).
> m a -> (a -> m b) -> m b
>

But if that's all you need to do, you could just use an Applicative Functor,
right? The picture I have at the moment is:

Functors can apply a function to a value inside a container.

Applicative functors provide pure expressions and sequencing, but no
binding. All applicative functors are also functors.

Arrows provide a way to set up more complicated pipelines with "tee"
junctions, etc. All arrows are also applicative functors (?)

Monads add binding. All monads are also arrows.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
http://www.haskell.org/pipermail/beginners/attachments/20100518/310ed213/attachment-0001.html

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

Message: 7
Date: Tue, 18 May 2010 06:51:03 +0200
From: Andres Loeh <and...@cs.uu.nl>
Subject: Re: [Haskell-beginners] Are monads pure?
To: beginners@haskell.org
Message-ID: <20100518045103.gc3...@cs.uu.nl>
Content-Type: text/plain; charset=us-ascii

> When I first started learning Haskell, I was under the impression that
> monads provided a way to encapsulate some imperative code so it didn't
> "contaminate" your functional code. But I think that's a misconception that
> I got because the first monad I dealt with was IO. Lately I've been reading
> more about monads, and (aside from IO), they are purely functional, aren't
> they? If they have state, they deal with it in a purely functional way.
> Behind the scenes, they thread the state through your computations so that
> you don't you don't have to bother with it. Is that correct? TIA.

You are right. IO is an exception, because it is a built-in type that
cannot be implemented in Haskell itself. Monads that are implemented in
Haskell without mentioning IO or interfacing via the FFI are generally
pure. Examples are state, errors, reader/writer, continuations,
lists, ... Nevertheless, people often refer to features such as state
and exceptions as "effects", and hence sometimes call code that makes
use of them "effectful" and code that does not "pure".

Cheers,
  Andres

-- 

Andres Loeh, Universiteit Utrecht

mailto:and...@cs.uu.nl     mailto:m...@andres-loeh.de
http://www.andres-loeh.de


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

Message: 8
Date: Tue, 18 May 2010 09:24:17 +0100
From: Stephen Tetley <stephen.tet...@gmail.com>
Subject: Re: [Haskell-beginners] Are monads pure?
Cc: beginners <beginners@haskell.org>
Message-ID:
        <aanlktileabpy7ndceiw2ll0oqmo3marxuc0ogcvfp...@mail.gmail.com>
Content-Type: text/plain; charset=ISO-8859-1

On 18 May 2010 05:37, Amy de Buitléir <a...@nualeargais.ie> wrote:

[SNIP]
>> [aditya siram]
>> With a monad you can
>> 1. takes some data and wraps it up in a type (return) :
>> a -> m a
>> 2. apply a function to the data within the type (>>=).
>> m a -> (a -> m b) -> m b
>
>
> But if that's all you need to do, you could just use an Applicative Functor,
> right? The picture I have at the moment is:
>
> Functors can apply a function to a value inside a container.
>
> Applicative functors provide pure expressions and sequencing, but no
> binding. All applicative functors are also functors.

Hello all


With bind, monads are a more powerful than applicative functors as
they give you the ability to perform context sensitive operations
whereas you could consider Applicative functors to be "context-free".

This means you can write more control operations for monads than
applicative functors, for instance you can have a State applicative
functor just as you can have a State monad. However with just
applicative you can't write the useful bracket function, which first
takes a snapshot of the state, performs the stateful function, then
restores the original state:


> newtype State st a = State { getStateF :: st -> (a,st) }


Functor instance:

> instance Functor (State st) where
>   fmap f (State sf) = State $ \st ->
>                         let (a,st1) = sf st in (f a,st1)

Applicative instance

> instance Applicative (State st) where
>   pure a = State $ \st -> (a,st)
>   (State sfab) <*> (State sf) = State $ \st ->
>                                 let (fab,st1) = sfab st
>                                     (a,  st2) = sf st1
>                                 in (fab a,st2)

Monad instance

> instance Monad (State st) where
>   return a = State $ \st -> (a,st)
>   (State sf) >>= smf = State $ \st ->
>                           let (a1,st1) = sf st1
>                               sfun     = getStateF (smf a1)
>                               (a2,st2) = sfun st2
>                           in (a2,st2)


> get :: State a a
> get = State $ \st -> (st,st)

> put :: a -> State a a
> put a = State $ \ _st -> (a,a)


> mbracket :: State st a -> State st a
> mbracket ma = do { st  <- get
>                  ; ans <- ma
>                  ; put st
>                  ; return ans
>                  }

Or without the do notation:

> mbracket' :: State st a -> State st a
> mbracket' ma = get    >>= \st  ->
>                ma     >>= \ans ->
>                put st >>= \_   -> return ans

No bracket with just the applicative machinery...


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

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://www.haskell.org/mailman/listinfo/beginners


End of Beginners Digest, Vol 23, Issue 26
*****************************************

Reply via email to