fcar
fcar

Reputation: 361

Haskell type-level projection

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.

Upvotes: 2

Views: 339

Answers (2)

J. Abrahamson
J. Abrahamson

Reputation: 74344

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

Upvotes: 1

Satvik
Satvik

Reputation: 11208

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.

Upvotes: 1

Related Questions