These are the user-visible extensions over Haskell:
- Strict EvaluationOrder is the default, but laziness can be introduced explicitly.
- Type directed FieldProjections complement type classing.
- All data objects support DestructiveUpdate.
Disciple uses region, effect and closure typing, and this information is used during compiler optimisations. Most of it can be inferred, but you do need to know about it when importing functions via the FFI. This information is also used to check that the meaning of programs that mix laziness and destructive update does not depend the on order of evaluation for the lazy parts, which is one of the criteria for being a purely functional language.
- The EffectSystem tracks what computational effects are being used in a program, without the need for state monads.
- The ClassSystem ensures that effects and destructive update play nicely with laziness.
- ClosureTyping is used to track data sharing, and to preserve soundness in the presence of PolymorphicUpdate.
For discussion of the motivations of Disciple and DDC, please see the first chapter of: Type Inference and Optimisation for an Impure World