
Hi, I have something like: data Stuff = Stuff { aNum :: Int , anStr :: String } deriving (Show) let first = Stuff 123 "qwe" let second = Stuff 321 "asd" print first print second and works fine. What is the right "map" statement if I want to generate these stuff using lists like: let strs = [ "qwe", "asd", "zxc" ] let nums = [ 123, 321, 345] ? Cheers: Szilva

Hi Szilveszter zipWith is probably what you are after...
zipWith Stuff nums strs [Stuff {aNum = 123, anStr = "qwe"},Stuff {aNum = 321, anStr = "asd"},Stuff {aNum = 345, anStr = "zxc "}]
Note zipWith (and the function zip which it generalizes) go 'short' - i.e. if one of the input lists is shorter than the other - the size of the result list will the size of of the shorter one:
zipWith Stuff [1] strs [Stuff {aNum = 1, anStr = "qwe"}]
Best wishes Stephen

Stephen's version is cleaner, but this works too:
map (\(x, y) -> Stuff x y) $ zip nums strs
----- Original Message ----
From: Stephen Tetley
zipWith Stuff nums strs [Stuff {aNum = 123, anStr = "qwe"},Stuff {aNum = 321, anStr = "asd"},Stuff {aNum = 345, anStr = "zxc "}]
Note zipWith (and the function zip which it generalizes) go 'short' - i.e. if one of the input lists is shorter than the other - the size of the result list will the size of of the shorter one:
zipWith Stuff [1] strs [Stuff {aNum = 1, anStr = "qwe"}]
Best wishes Stephen _______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners

If you're ready to write a lambda expression why not you just say:
zipWith (\ x y -> Stuff x y ) nums strs
Yet now this one naturally reduces to Stephen's version. Go with that one :)
On Tuesday, March 16, 2010, Tim Perry
Stephen's version is cleaner, but this works too: map (\(x, y) -> Stuff x y) $ zip nums strs
----- Original Message ---- From: Stephen Tetley
To: Szilveszter Juhos Cc: Beginners@haskell.org Sent: Tue, March 16, 2010 2:09:51 AM Subject: Re: [Haskell-beginners] generating by mapping Hi Szilveszter
zipWith is probably what you are after...
zipWith Stuff nums strs [Stuff {aNum = 123, anStr = "qwe"},Stuff {aNum = 321, anStr = "asd"},Stuff {aNum = 345, anStr = "zxc "}]
Note zipWith (and the function zip which it generalizes) go 'short' - i.e. if one of the input lists is shorter than the other - the size of the result list will the size of of the shorter one:
zipWith Stuff [1] strs [Stuff {aNum = 1, anStr = "qwe"}]
Best wishes
Stephen _______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
-- Ozgur Akgun
participants (4)
-
Ozgur Akgun
-
Stephen Tetley
-
Szilveszter Juhos
-
Tim Perry