[Haskell-cafe] Newbie questions
Crypt Master
cryptmaster at hotmail.com
Sat Jul 3 05:07:05 EDT 2004
Hi
Thanks for responding and taking the time to respond so fully. Its much
appreciated!
>From what I can see, a key difficulty you're having is with the
>"evolvepopulation" function. You've given it the type a -> a, which
>pretty much requires it to be an identity function, because it's not
>allowed to make any assumptions about the values it takes.
I was going trying for generic as possible, I am keen to expore how much
more expressive one can be in functional lanaguages.
>To make things easier to read, try defining types for Population and
>Individual (they can always be generalized later).
> type Individual = Int
> type Population = [Individual]
A use fill tip, thanks.
[Snip]
>It looks like you're defining evolution as the composition of mutate,
>cross, and select, but got tripped up by the order of evaluation.
>Specifically, "mutate cross select p" is the same as "((mutate cross)
>select) p", which probably isn't what you want.
It only recently dawned on me that functions are left asscoaitive and your
absolutly right its not what i had in mind.
>If you have:
> mutate :: Population -> Population
> cross :: Population -> Population
> select :: Population -> Population
>Then you could define
> evolve p = mutate (cross (select p))
>
> -- alternative:
> -- evolve = mutate . cross . select
I now get what the f.g is as well :-) Thanks, the alternate format with the
original has just clicked something else into place.
>Starting from an initial population, you want to generate a sequence by
>iterating evolve, starting from an initial population. Haskell provides
>a function "iterate" for this purpose, or you can define your own.
Yeah other posters suggested this as well. I now have the the same function
as you mentioned which is very nice:
gaSolutionSpaceFrom :: a -> [a]
gaSolutionSpaceFrom = iterate evolvePopulation
[snip]
>I found it helpful to remember that you can think of a function f :: a
>-> b -> c as taking two arguments of types a and b and returning a
>result c, or as taking a single argument of type a and returning a
>result of type b -> c. Once you become comfortable with partial
>application, a lot of Haskell code starts to make more sense.
I understood the partial application when explained in simple terms, but I
find I have a hard time when it used in more coimplicated examples. The
currying in the "The Haskell School of Expression" left with a big "Huh",
even though a simple application makes sense to me.
"The craft of Functional Programming" it seesm thicker more methdoical, so I
may get some more of the basics down in the next few weeks.
Thanks again.
------------------------------
Message: 8
Date: Sat, 03 Jul 2004 08:38:55 +0000
From: "Crypt Master" <cryptmaster at hotmail.com>
Subject: Re: [Haskell-cafe] Newbie questions
To: duncan.coutts at worcester.oxford.ac.uk
Cc: haskell-cafe at haskell.org
Message-ID: <BAY18-F13KHmj9n1xxW00056ac5 at hotmail.com>
Content-Type: text/plain; format=flowed
[Snip]
People say function application in Haskell is written without brackets
but this can be misleading, here you do need brackets to indicate that
'gaSolutionSpace [1,2,3,4,5]' is one argument and not two. So you should
write:
take 5 (gaSolutionSpace [1,2,3,4,5])
[Snip]
Thanks alot, this was very helpfull. It also makes more sense now that I
looked up the associativity of functions and found it to be left assoc. For
some reason I assumed it would automaically bracket form the right as such
(take (5 (gaSolutionSpace [1,2,3,4,5])))
but its actually this
(((take 5) gaSolutionSpace) [1,2,3,4,5])
Thanks again.
_________________________________________________________________
Tired of spam? Get advanced junk mail protection with MSN 8.
http://join.msn.com/?page=features/junkmail
------------------------------
Message: 9
Date: Sat, 03 Jul 2004 08:46:24 +0000
From: "Crypt Master" <cryptmaster at hotmail.com>
Subject: [Haskell-cafe] Re: Newbie questions
To: wferi at afavant.elte.hu
Cc: haskell-cafe at haskell.org
Message-ID: <BAY18-F16gyf2M0KFHR000262c6 at hotmail.com>
Content-Type: text/plain; format=flowed
>-- gaSolutionSpace :: [a] -> [a]
>>gaSolutionSpace x = x : gaSolutionSpace (evolvepopulation x)
-Stop deceiving yourself until it's too late.
-Why did you comment out the type annotation?
*Sheepish Grin* its historical, my original thought and attempt was that you
would recieve a list of populations and evolve it to a bigger list of
populations. Hence the [a] -> [a]. It didnt work out too well as this is
what I came up with:
gaSolSpace [x:xs] = gaSolutionSpace [x : evolePopulation x]
Eventually i realised that I needed to evolve a single population, not a
list, which let to a -> [a] and thanks to Keith I now have this:
gaSolutionSpaceFrom :: a -> [a]
gaSolutionSpaceFrom = iterate evolvePopulation
Thanks
_________________________________________________________________
Add photos to your e-mail with MSN 8. Get 2 months FREE*.
http://join.msn.com/?page=features/featuredemail
------------------------------
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe at haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
End of Haskell-Cafe Digest, Vol 11, Issue 3
*******************************************
_________________________________________________________________
Help STOP SPAM with the new MSN 8 and get 2 months FREE*
http://join.msn.com/?page=features/junkmail
More information about the Haskell-Cafe
mailing list