Changes between Version 4 and Version 5 of Defaulting


Ignore:
Timestamp:
Nov 20, 2006 11:55:24 AM (7 years ago)
Author:
malcolm.wallace@…
Comment:

Add two new proposals for defaulting

Legend:

Unmodified
Added
Removed
Modified
  • Defaulting

    v4 v5  
     1[[PageOutline]] 
    12= Defaulting = 
    23 
     
    5354 * can not exactly replicate behavior of existing defaulting mechanism, but can come close. 
    5455 * might hide errors, an optional warning on defaulting should be possible. 
     56 
     57 
     58== Proposal 2 == 
     59 
     60Change the syntax of the defaulting clause from: 
     61{{{ 
     62topdecl  ->  default ( type_1 , ... , type_n ) 
     63}}} 
     64to 
     65{{{ 
     66topdecl  ->  default ( tycls_1 => type_1 , ... , tycls_n => type_n ) 
     67}}} 
     68Semantically, which type is chosen is determined by the class context at the choice point (after context simplification).  If there is no unique choice, for instance because more than one class-with-a-default is mentioned in the context (and their default types are different), then it is a static error.  Note that it is OK to have several classes in the context of the defaultable value, provided only one of them is declared to yield a default type, or if more than one yields a type, those types are the same.  Choosing a default after context simplification means that no conflicts between super- and sub-classes can arise. 
     69 
     70The current Haskell'98 default-default behaviour can be specified as: 
     71{{{ 
     72default ( Num => Integer 
     73        , Real => Integer 
     74        , Enum => Integer 
     75        , Integral => Integer 
     76        , Fractional => Double 
     77        , RealFrac => Double 
     78        , Floating => Double 
     79        , RealFloat => Double 
     80        ) 
     81}}} 
     82 
     83=== Pros === 
     84 * less ad hoc than current method 
     85 * overcomes the Hat transformation problem 
     86 * does not rely on textual ordering of decl 
     87 * permits defaulting of user-defined classes, not just Prelude ones 
     88 
     89=== Cons === 
     90 * not sure if this exactly captures the existing Haskell'98 module (but because defaults are currently limited to Prelude classes, it probably does). 
     91 
     92== Proposal 3 == 
     93Orthogonal to the issue of how to specify defaults, is the question of whether they should be module-local, or if instead we should treat them like instance declarations - global in scope.  One can also imagine permitting explicit lexical scoping, i.e. a local override of the defaults, purely within a single function definition. 
     94 
     95Concrete proposal:  a default decl can occur anywhere that a type signature would be valid, and has the same scope.  However, because default decls cannot be named, all default topdecls must be unique throughout a program.  By contrast, a local default decl can override one at an outer scope, but only within its own inner scope. 
     96 
     97=== Pros === 
     98 * Arguably, when user-defined classes and types are involved, it is a lot clearer to make any necessary default decls once only, in a library, and just have them apply everywhere, rather than to require end-users to understand the issues and make their own default decls. 
     99 * Having consistent defaults throughout a program is semantically nicer (but you still get the opportunity to override them locally if you _really_ need to - just like with operator fixities). 
     100 
     101=== Cons === 
     102 * Changes the Haskell'98 behaviour (where defaults are module-local).  Question: Do any real programs actually rely on the Haskell'98 spec here?