I am curious about why the data families syntax was chosen to be the way it is. For example a list can be defined as follows:data family List a
data instance List Char = Empty | Cons Char (List Char)
data instance List () = Count Int
Instead why not define it as:
data List :: * -> *
data List Char = Empty | Cons Char (List Char)
data List () = Count Int
The latter form looks more intuitive and easy to remember to me since it is very similar to the way value level functions are defined (signature & pattern matching defs). Here we are just defining a type level function instead.
-harendra