I am trying to get a grip on the relationship between these two concepts.
First consider an example of an Abstract Data Type:
data Tree a = Nil
| Node { left :: Tree a,
value :: a,
right :: Tree a }
According to Haskell wiki:
This type is abstract because it leaves some aspects of its structure undefined, to be provided by the user of the data type. This is a weak form of abstract data type. Source
Now consider the notion of parametric polymorphism:
Parametric polymorphism refers to when the type of a value contains one or more (unconstrained) type variables, so that the value may adopt any type that results from substituting those variables with concrete types. -- Source
Here an example of id :: a -> a is given:
For example, the function
id :: a -> acontains an unconstrained type variable a in its type
Question: What is the formal relationship between these two concepts? In particular, are all instances of abstract data types also instances of parametric polymorphism? What about vice versa?