Would it have been legal to define data JSValue as something like this instead? data JSValue = JSValue | JSValue !Bool | JSValue !Rational | JSValue JSString | JSValue [JSValue] | JSValue (JSObject JSValue)