[Haskell-cafe] Help to write type-level function
Dmitry Kulagin
dmitry.kulagin at gmail.com
Wed Feb 27 11:01:20 CET 2013
Very clear solution, I will try to adopt it.
Thank you!
On Wed, Feb 27, 2013 at 12:17 PM, Aleksey Khudyakov <
alexey.skladnoy at gmail.com> wrote:
> On 27 February 2013 12:01, Raphael Gaschignard <dasuraga at gmail.com> wrote:
> > I think it might be impossible with type families. I don't think it's
> > possible to differentiate with type families something like T a a, and T
> a
> > b, with b different from a.
> >
> It's indeed impossible to write such type function using type
> families. It will be possible with new closed type familes (they are
> in GHC head already).
>
> But for now it's possible to use overlapping instances and fundeps.
> Implementation of type level equality is simple and it's only
> instances which need ovelap.
>
> -- | Type class for type equality.
> class TypeEq (a :: α) (b :: α) (eq :: Bool) | a b -> eq
> instance TypeEq a a True
> instance eq ~ False => TypeEq a b eq
>
>
> Implementation of lookup by key is relatively straightforward. Note
> that it doesn't check that key is unique.
>
> data k :> v
> infix 6 :>
>
> -- | Lookup type for given key
> class TyLookup (map :: [*]) (k :: *) (v :: *) | map k -> v where
>
> class TyLookupCase (map :: [*]) (k :: *) (v :: *) (eq :: Bool) | map k
> eq -> v where
>
> instance ( TypeEq k k' eq
> , TyLookupCase (k :> v ': xs) k' v' eq
> ) => TyLookup (k :> v ': xs) k' v' where
>
> instance TyLookupCase (k :> v ': xs) k v True where
> instance TyLookup xs k v => TyLookupCase (k' :> v' ': xs) k v False where
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20130227/d16cb8f7/attachment.htm>
More information about the Haskell-Cafe
mailing list