Records in Haskell

J. Garrett Morris jgmorris at
Thu Mar 1 08:17:25 CET 2012

On Wed, Feb 29, 2012 at 11:05 PM, AntC <anthony_clayden at> wrote:
> I repeat: nobody is using a "type-level string". You (or someone) is
> making it up.

It isn't clear where that idea came from.

On Thu, Sep 15, 2011 at 7:51 AM, Simon Peyton-Jones
<simonpj at> wrote:
> Yes, it would, and of course any impl of TDNR would need an internal
> constraint similar to your Select.  In my original proposal I was
> hiding that, but it has to be there in the implementation.  But you
> are right that making it explicit might be a good thing.  Esp with
> Julien's new kind stuff (coming soon) we should be able to say
> class Select (rec :: *) (fld :: String) where
>   type ResTy rec fld:: *
>   get :: rec -> ResTy rec fld
> data T = MkT { x,y :: Int }
> instance Select T "x" where
>   get (MkT {x = v}) = v


On Mon, Jan 2, 2012 at 4:38 AM, Simon Peyton-Jones
<simonpj at> wrote:
> It seems to me that there's only one essential missing language feature,
> which is appropriately-kinded type-level strings (and, ideally, the ability
> to reflect these strings back down to the value level).
> Specifically
> * Allow String as a new kind
> * Now you can define classes or types with kinds like
> MyCls :: String -> a -> Constraint
> T :: String -> *
> * Provide type-level string literals, so that “foo” :: String


You may want to call your type-level-things-that-identify-fields
strings, labels, fieldLabels, or rumbledethumps, but surely that's not
the point of interest here?


"Would you be so kind as to remove the apricots from the mashed potatoes?"

More information about the Glasgow-haskell-users mailing list