forall introduces a locally scoped, universally quantified type variable. In a GADT constructor, it keeps the result type inside that constructor instead of making one result type govern the entire language. section 6.4.2
A locally typed DSL operation
data LogicControlMethod next = forall a. EvalHdl (Hdl a) (a -> next) | forall a. EvalDeviceControlMethod (DeviceControlMethod a) (a -> next). One script can therefore evaluate an Hdl returning controllers and another returning unit without forcing a common result type.
