That's a good point. I think both cases (generic and specific) have use.
The generic case allows a kind of convention: All types defined by (string,int) can create the appropriate _val()_ function and get the _new()_ function for free. The specific case allows for customization: A type can create a custom _new()_ and bind it (or not) to a custom _val()_ of their choosing.