[Haskell-cafe] Newbie questions
cryptmaster at hotmail.com
Thu Jul 1 12:01:24 EDT 2004
I consider myself a pretty good imperative programmer, been at it for
decades, and am tryibng my hand at Haskell now. Unfrituantly I am not
"getting" it all that quickly despite having the multimedia haskell book.
To start ghetting some hands on, I thought iI owuld do something which i
have done many times before in imperatives, a basic Genetic Algorithm
Library. Unfortunatly I am comming unstuck straight away and was hoping some
of you kind folk could point in the direction of dry land :-)
iIf your not familiar with GAs its not too important, simply a GA searches
over the whole solution space randomly. Well not quiet, its a guided search,
its guided by evolution ie by the fitness of each indicidual of a random
initial population. Evolution is simulated by 3 basic operators, selection,
cross over and mutation. selection is which indiviuals get to breed, cross
over is how they breed, and mutation is just things intetresting.
So after reading the multimedia book, Iimmediately thought of a defining the
solution space as a infinite list. I was hoping then I could do things like
take 5 gaSolutionSpace to get 5 iterations or generations. My first attempt
tied to use lis syntax , but it wouldnt compile and after seeing
"numsFrom" ina tutorial I redefined it as such. Here is what I have so far:
-- gaSolutionSpace :: [a] -> [a]
-- gaSolutionSpace  = gaSolutionSpace createRandomPopulation -- recursive
gaSolutionSpace x = x : gaSolutionSpace (evolvepopulation x)
evolvepopulation :: a -> a
evolvepopulation p = mutate cross select p
-- createRandomPopulation :: [Num a]
createRandomPopulation = [1,23,4,5,6]
cross p = p
mutate p = p
select p = p
The take operator doesnt work on this. from hugs:
HAGA> take 5 gaSolutionSpace [1,2,3,4,5]
ERROR - Type error in application
*** Expression : take 5 gaSolutionSpace [1,2,3,4,5]
*** Term : take
*** Type : Int -> [e] -> [e]
*** Does not match : a -> b -> c -> d
I am not sure I follow this. I assume its cause I didnt use the list
notation in definaing gaSolutionSpace. Any ideas on how to do that. ? What
about using map. It occurs to me that you can define gaSolutionspace as a
map of the evolvolepopuloation function acrossan infinite solution space,
but I dont know how to makethis infinte list to map over ...?
There ar 2 papaers on GAs in haskell, but they use monads. I realise for
performance I will probably have to use them too, but for now I would liek
to do it without mondas even if performance isnt optimal.
Sorry again for the newbie questions, but any help is appreciated.
Add photos to your e-mail with MSN 8. Get 2 months FREE*.
More information about the Haskell-Cafe