# help with types and composition Classic List Threaded 4 messages Open this post in threaded view
|

## help with types and composition

 I would like to write a function that takes two lists of numbers and returns a number. For simplicity, let's assume an integer, i.e. myfunc:: [Integer]->[Integer]->Integer But I can't quite get things right when trying to define myfunc = ...  and making the arguments implicit. My difficulty might be seen with the following two functions, let, f1 = (zipWith (\$)) . (map  (*)) f2 = sum if I set the types such that f1 returns [Integer] and sum accepts [Integer] it seems that somehow I should be able to compose them in to a single function that takes two lists and returns the number, but f1 . f2 and numerous variations don't work. I can curry some list l and f1 . (f2 l) works, but is there a way to get f1 and f2 combined into a function that accepts two lists? My problem is not really about writing the function but about composition. I can write the function with arguments or a local lambda   that suits my practical purpose. But the fact that I think I should be able to compose f1 . f2 somehow reveals a conceptual misunderstanding that I hope someone will help me clear up. Thank you, Britt Anderson -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20090702/5c952c69/attachment.html
Open this post in threaded view
|

## help with types and composition

 > > f1 = (zipWith (\$)) . (map  (*)) > > f2 = sum > First, f1 would be clearer as zipWith (*). Second, look at the type of (.): (.) :: (b -> c) -> (a -> b) -> (a -> c) Notice that (b -> c) and (a -> b) each take one argument, but f1 takes two arguments. That's why using (.) with f1 doesn't work. You can do what you want by uncurrying f1 so it takes only one argument, which makes it easier to compose. You can then re-curry the result after you do the composition. f1 :: [Integer] -> [Integer] -> [Integer] uncurry f1 :: ([Integer], [Integer]) -> [Integer] f2 . uncurry f1 :: ([Integer], [Integer]) -> Integer curry (f2 . uncurry f1) :: [Integer] -> [Integer] -> Integer I'm sure there are shorter versions that use more than just (.), curry, and uncurry. -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20090702/2955a16d/attachment.html