Haskell type-level projection

353 views Asked by At

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.

2

There are 2 answers

0
J. Abrahamson On BEST ANSWER

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
1
Satvik On

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.