On Thursday 24 February 2005 19:51, Keean Schupke wrote: > Benjamin Franksen wrote: > >I still wonder if your TH generated code can handle higher ranked field > > types; i.e. can I write > > > >$(ttypelift [| data Record = Record { > > field1 :: Int, > > field2 :: (forall a. a-> a) } |] ) > > > >or does ghc give me an error? > > Well at the moment this would give an error, but remember the > list is heterogeneous, so you can just not give the list a type, and > simply append the specific function... admitedly this is not as > type-safe. > > hUpdateAtLabel field2 someFunction myRecord
That is an advantage of hLists as compared to normal records. A disadvantage is that each field access needs to traverse the list. I wonder if this isn't rather less efficient than the random access provided by normal records. > Of course if the type of the function is unknown until runtime, we have > to use existential quantification. > > It might be possible to automatically wrap such types, but my feeling at > the moment is that it is best left to the programmer. Automatic wrapping is easy. What is not so easy and I think not even possible, is automatic _un_wrapping, so that the wrapping isn't exposed at all to the programmer. I am not a type system guru, so can anyone enlighten me on why higher ranked types are not allowed in instances? Is there a principle problem, or is it just difficult to implement? Does this have to do with this "higher order unification" that Haskell is alleged not to have? Ben _______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell