I'm confused about the arrow and what it actually means in the data constructor. I'm surprised it even compiled but I have no idea how to use it.
If I try to use it as the name of a data constructor it doesn't parse, and I'm not sure how else to interpret it. If I interpret it as a function type then the data constructor has no name which also does not make sense to me.
data Type
= TBool
| TInt
| Arrow Type Type
| (->) Type Type
test :: Type
test = Arrow TBool TInt -- Ok
test' :: Type
test' = (->) TBool TInt -- Parse Error on input '->'