Dependent types in practical programming