I have a bunch of types where their hierarchy stores some useful information. I'm trying to avoid having to bake in knowledge of the hierarchy of the types into the functions that operate on them.
The following is a little excerpt of Stanford's Typed Dependencies for natural language processing:
root - root dep - dependent aux - auxiliary auxpass - passive auxiliary cop - copula arg - argument agent - agent
I would like to create some data types that mirror this structure so that I can define some functions that can only operate on certain types. When I have a function that operates on an
arg, the type that I use to represent
arg should also include
agent but the type for
agent should not include
arg. The type for
dep should include anything below it.
Is this possible in haskell? I've been trying to declare various
data types to model this, but I can't get it to work since a data type cannot use the constructor of another data type.
I suspect that maybe this approach doesn't work very well with Haskell, so if that's the case how do you usually deal with these cases where flattening the hierarchy is definitely undesirable?