#7111: record single inheritance, partial solution to record problem ------------------------------+--------------------------------------------- Reporter: centaurian_slug | Owner: Type: feature request | Status: new Priority: normal | Component: Compiler Version: 7.4.2 | Keywords: Os: Unknown/Multiple | Architecture: Unknown/Multiple Failure: None/Unknown | Testcase: Blockedby: | Blocking: Related: | ------------------------------+--------------------------------------------- The record system reminded me of the situation in assembly language. Could "single inheritance of records" allow some shared field names as a stopgap solution without breaking much of the existing language and source, or precluding future solutions to this issue;
Under this proposal, accessor functions in the same namespace would always access the same slot. imagine a keyword 'extends' in a data constructor that creates any boilerplate behind the scenes. data Base = Base { slotA::Int32, slotB::Int32 } data Foo = Foo extends Base { foo :: Int32 } data Bar = Bar extends Base { bar1 :: Float,bar2 ::Float } 'slotA' is now always a function to extract the first element of a 2,3,4 element tuple 'slotB' is now always a function to extract the second element of a 2,3,4 element tuple 'foo' is a functions to extract the 3rd slot. 'bar1','bar2' are functions to extract the 3rd,4th slots by analogy with c++, struct Base { int32 slotA,int32 slotB; }; 'a' now corresponds to an memory offset of 0 'b' now corresponds to an memory offset of 4 struct Foo : public Base { int32 foo; }; 'foo' now corresponds to a memory offset of 8 struct Bar : public Base { float bar1; float bar2; }; // 'bar1' now corresponds to a memory offset of 8 // 'bar2' now corresponds to a memory offset of 12 // 'a' corresponds to a ptr offset of 0, for all types // 'b' corresponds to a ptr offset of 4 for all types By analogy to assembly-language:- ; declare 'Base' datsstructure elements RSRESET ;clear structure offset counter slotA RW 1 ; reserve 1 word for 'slotA' slotB RW 1 baseSize RW 0 ; declare 'Foo' datastructure elements RSSET baseSize ; 'Foo' extends 'Base', set counter to end of 'Base' foo RW 1 fooSize RW 0 ; declare 'Bar' datastructure members RSSET baseSize ; 'Bar' extends 'Base' bar1 RW 1 bar2 RW 1 barSize RW 0 ;result:- (4byte words) ;slotA=0, slotB=4, foo=8, bar1=8, bar2=12 ; baseSize=0; fooSize=12; barSize=16 -- Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/7111> 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