Question

Is there any way of defining a type level projection without using type families?

I do it like so:

{-# LANGUAGE TypeFamilies #-}
type family Project t :: *
type instance Project [r] = r ,

but I really only ever use one instance of it.

Was it helpful?

Solution

You can use MultiParamTypeClass and FunctionalDependencies, though without knowing why you're using it it's hard to say if this is sufficient.

class Project k a | k -> a
instance Project [r] r

> :t undefined :: Project String r => r
undefined :: Project String r => r :: Char

OTHER TIPS

I am not sure where you are going to use that exactly. But I tend to use type level projections only to satisfy the haskell type system. What I usually do is to define a function like this:

project :: [a] -> a
project = undefined

Now using project on an object of type [a] will give me an object of type a.

Another function which I use (although sometimes) along with the above is asTypeOf.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top