#3632: lift restrictions on records with existential fields, especially in the
presence of class constraints
------------------------------------------------+---------------------------
Reporter:  eflister                             |          Owner:               
   
    Type:  feature request                      |         Status:  new          
   
Priority:  normal                               |      Component:  Compiler     
   
 Version:  6.10.4                               |       Severity:  normal       
   
Keywords:  existential records accessor update  |       Testcase:               
   
      Os:  Unknown/Multiple                     |   Architecture:  
Unknown/Multiple
------------------------------------------------+---------------------------
 the attached file demos the use of a record with an existential field with
 a class constraint.  it shows several cases where lifting the current
 restrictions on accessing and updating this field would be both well-
 defined and useful.

 here is the record definition; the dur field is existential, but
 constrained to be in class NoteDur.

 {{{
 data Note = forall x . NoteDur x => Note {
       midiNum :: Int -- 0-255
     , vel     :: Int -- 0-255
     , chan    :: Int -- 0-15
     , measure :: Integral a => a
     , beat    :: Int
     , subdiv  :: RealFrac a => a -- % of beat
     , dur     :: x
     }
 }}}

 here is a walk through of places in the code where the current
 restrictions are unnecessary and intrusive:

 lines 64-95 -- these functions wouldn't be necessary if record update
 syntax were enabled for both existential and non-existential fields.  i
 know 6.12 introduces it for non-existentials, but i don't see why it isn't
 also possible for existential fields (even without a class constraint).
 lines 33-35 and 60 show how much nicer it is to use regular updater syntax
 in this case.

 the same is true for existential accessors when there is a class
 constraint -- there's no need to restrict this situation because the
 accessor can have type:
 fieldName :: (SomeClass x) => Record -> x
 line 142 shows a case where this would be very nice to have.

 line 100 + 107 -- the foralls could be implicit (maybe offer an extention
 that would allow them to be implicit)

 lines 134-136 compared to 138-139 show how additional factoring could be
 achieved if one were allowed to pattern match on the type of an
 existential with class constraints.

 lines 124-127 show how it would be nice to have existential classes

 lastly, allow curried updater functions:
 (rec {field = }) 5
 instead of
 (\x -> (rec {field = x})) 5

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/3632>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
Glasgow-haskell-bugs@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to