On Tue, 2008-01-08 at 11:33 +0100, Peter Verswyvelen wrote: > Jon Harrop wrote: > > On Monday 07 January 2008 20:27:17 Peter Verswyvelen wrote: > > > >> If your compiler (pretty amazing job btw) does whole program optimization, > >> can it remove the dictionary (aka v-table in C/C++ parlance?) overhead of > >> type classes? Because if I understand it correctly, unless one uses > >> existential types, a dictionary can be compiled away since the type in > >> question is known at compile time? > >> > > > > Yes. This is essentially what F# does. > > > Hang on. > > When I asked a similar question in the F# forum, it seemed that F# > simply does not have type classes (but it does support .NET interfaces), > and root functions are only fully polymorphic when you mark them *inline*. > > For example, the following will not work in the current version of F#: > > **let add x y = x + y > let t1 = add 1 2 > let t2 = add 1.0 2.0** > > The first usage of add forces it to work on integers, and then its type > is settled once and for all. If I understood it correctly, this is > because the "root polymorphic" add function can only work on specific > types because it gets compiled into an object file. > > You can force it to work on any type on which + can be applied by > forcing the function to be inline, like > > let inline add x y = x+y > let t1 = add 1 2 > let t2 = add 1.0 2.0 > > Then I guess the code will not be part of the object file, but it will > be inserted inplace whenever it gets used (which could result in code > bloat?) > > Can the same trick be used in GHC? > > Regarding Derek Elkins excellent example > > f :: Show a => Int -> a -> String -- type signature required > f 0 x = show x > f n x = f (n-1) (x,x) > > this indeed cannot be inlined nor optimized away, since you generally > don't know the value of the first parameter at runtime. But this is a > very specific case no? According to what I interpret from John Meacham's > email, this case is an exception, and in many cases class type > dictionary overhead gets compiled away?
Quoting my previous email with added emphasis, "Even in Haskell 98 it is not quite possible to do this. <<You can get rid of the vast majority of them>>, but the type is not always known at compile-time. There is one situation where the types depend on values. This occurs when you utilize polymorphic recursion." The point of my email was that it is not possible to -completely- eliminate dictionaries (or some other run-time witness) in general. _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
