
On Sun, Mar 25, 2012 at 5:01 AM, TP
Hello,
My primary problem may be reduced to adding elements of two lists: [1,2,3] + [4,5,6] = [5,7,9]
My first idea was to declare a list of Int as an instance of Num, and define (+) in the correct way. However, it seems it is not possible to do that:
------------------- instance Num [Int] where l1 + l2 = .... -------------------
Why? It seems it is necessary to do:
------------------ newtype ListOfInt = ListOfInt { getList :: [Int] } deriving (Show, Eq)
instance Num ListOfInt where l1 + l2 = ... -------------------
Am I correct? Is it the best way to do that?
Now, what is the most usual way to implement l1+l2? I have just read about applicative functors, with which I can do:
------------------- import Control.Applicative let l1 = [1,2,3] let l2 = [4,5,6] print $ getZipList $ (+) <$> ZipList l1 <*> ZipList l2 [5,7,9] -------------------
Is it the correct way to do that? I have tried:
------------------- instance Num ListOfInt where l1 + l2 = ListOfInt $ getZipList $ (+) <$> ZipList (getList l1) <*> ZipList (getList l2) -------------------
Isn't it too much complicated?
Thanks
TP
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
As Michael suggests using zipWith (+) is the simplest solution. If you really want to be able to write [1,2,3] + [4,5,6], you can define the instnace as instance (Num a) => Num [a] where xs + ys = zipWith (+) xs ys You'll also likely want to give definitions for the other functions ((*), abs, signum, etc.) as well.