
I still don't know whether I like this idea or not, but here is the simplest definition I can think of about what it promises. Using TDNR, it will be possible to write the following code: data Foo = Foo { name :: String } data Bar = Bar { name :: String } getName :: Either Foo Bar -> String getName (Left f) = name f getName (Right b) = name b However, currently you cannot: "Multiple declarations of 'name'" There are basically two things you can do to solve this "problem". - Use different names for your functions, a la "fooName, barName". This clutters up your code, and sometimes you may not have access to that part of the code. - Define these 2 data types in different modules and import qualified, a la "Foo.name, Bar.name". One might still think this clutters up your code. In any case, as a programmer you need to resolve which function to use depending on types while defining 'getName'. However compiler has enough information to automate this decision for you. This is not a way to do polymorphism, this is merely a way to allow programmers define more than one function with the same name, but different types. This kinda sounds like what java people think polymorphism is :P -- Ozgur Akgun