generalizing overloaded list syntax to Sized Lists, HLists, HRecords, etc
|Reported by:||nwf||Owned by:||carter|
|Keywords:||Cc:||giorgidze@…, info@…, jeroen.weijers@…, eir@…, gershomb@…|
|Type of failure:||None/Unknown||Test Case:|
|Related Tickets:||#9883||Differential Rev(s):|
First, sorry if I've missed an earlier request for this in trac; a few searches did not turn up anything relevant.
I've recently taken to doing a lot of work with heterogenous lists (thanks to the DataKinds work) and find the forced-cons-and-nil style of writing lists (e.g. "a:+b:+c:+HN") to be sort of unpleasant.
Would it be possible to allow rebinding list-literal syntax? Off the top of my head I think something like the following might be workable, if only I could stop  and (:) from being in scope, even with -XNoImplicitPrelude. (Example requires -XDataKinds -XFlexibleInstances -XGADTs -XMultiParamTypeClasses -XTypeOperators)
class HasNil a where () :: a isNil :: a -> Bool class HasCons e l l' | e l -> l', l' -> e l where (:) :: e -> l -> l' uncons :: l' -> Maybe (e,l) -- For homogeneous lists... instance HasNil [a] where () = () isNil = null instance (a ~ a1, a ~ a2) => HasCons a [a1] [a2] where (:) = (:) uncons  = Nothing uncons (x:xs) = Just (x,xs) -- For HLists... data HList as where HN :: HList ' (:+) :: a -> HList as -> HList (a ': as) instance HasNil (HList ') where () = HN isNil = const True instance (a ~ a1, as ~ as1) => HasCons a (HList as) (HList (a1 ': as1)) where (:) = (:+) uncons (a :+ as) = Just (a,as)
Change History (19)
comment:1 Changed 4 years ago by
|Cc:||giorgidze@… info@… jeroen.weijers@… added|
comment:7 Changed 2 years ago by
|Owner:||set to carter|
|Summary:||Rebindable list syntax? → generalizing overloaded list syntax to Sized Lists, HLists, HRecords, etc|