Intuitively the following scenarios seem to be related, can anyone point my in the direction of formal work on this, or give me the formal terms I need to search around? 1. Adding two integers together: Int -> Int -> Int 2. Adding two lists of Integers together: [Int] -> [Int] -> [Int] 3. Adding two lazy streams of integers together, possibly in seperate (parallel) processes for example. cheers, Toby