Benjamin Franksen wrote:

>On Thursday 24 February 2005 23:27, Keean Schupke wrote:
>
>>Well, not quite true, because the type of the label is used to index the
>>value, the selection happens at compile time. So at run time there is no
>>instance selection left... it is simply the value. At least in theory!
>
>Hmm. I haven't seen it from this perspective, yet! At first reading, I thought
>this is simply too good to be true. I mean, there is some sort of list
>structured thing representing the whole record, right? Then how can the
>function that selects an element *not* traverse through the list?


It does. An HList of Int,Bool,Char is isomorphic to the type (Int,(Bool,(Char,()))), and selecting the Bool element will ultimately compile to code like this:

   case list of
     (_,(x,_)) -> ...

It doesn't need to search for the right element at runtime, and it doesn't need to check for end-of-list at runtime, but it does need to deconstruct O(n) pairs at runtime. A statically balanced tree structure would reduce that the O(log n), but I doubt it would improve performance for typical record sizes.

Of course, inlining may well lead to something like

   case (a,(b,(c,()))) of
     (_,(x,_)) -> ...

which can be optimized away.

-- Ben

_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to