Sorry for not giving rationals or details.<p>Catnaroek said it already: without parametric polymorphism you are forced to either: 1) commit to a single type upfront which limit the utility (string in your example I think), 2) use interface{} and suffer the boxing in every circonstances while not having any static type checking.<p>I actually like your pattern. I think it makes sense to have a process as a pair of input and output streams.