first-class-families/README.md

48 lines
1.3 KiB
Markdown
Raw Normal View History

2018-07-11 07:31:05 +03:00
# First-class type families [![Hackage](https://img.shields.io/hackage/v/first-class-families.svg)](https://hackage.haskell.org/package/first-class-families) [![Build Status](https://travis-ci.org/Lysxia/first-class-families.svg)](https://travis-ci.org/Lysxia/first-class-families)
2018-07-11 07:27:07 +03:00
2018-12-17 20:01:42 +03:00
For example, consider this simple type family:
```haskell
type family FromMaybe (a :: k) (m :: Maybe k) :: k
type instance FromMaybe a 'Nothing = a
type instance FromMaybe a ('Just b) = b
```
With first-class-families, it translates to a `data` declaration
and instances for a single `Eval` family:
```haskell
import Fcf
data FromMaybe :: k -> Maybe k -> Exp k
type instance Eval (FromMaybe a 'Nothing) = a
type instance Eval (FromMaybe a ('Just b)) = b
```
2018-09-12 22:53:12 +03:00
2018-12-17 20:08:29 +03:00
That way, the `FromMaybe` constructor can be passed to higher-order fcfs.
```haskell
Eval (Map (FromMaybe 0) '[ 'Just 1, 'Nothing ]) = '[ 1, 0 ] :: [Nat]
```
2018-12-17 20:01:42 +03:00
Essential language extensions:
```haskell
{-# LANGUAGE
DataKinds,
PolyKinds,
TypeFamilies,
TypeInType,
TypeOperators,
UndecidableInstances #-}
```
## See also
[Haskell with only one type family](http://blog.poisson.chat/posts/2018-08-06-one-type-family.html) (blogpost)
2018-07-11 07:27:07 +03:00
---
Contributions are welcome. Feel free to open an issue or make a PR on
[Github](https://github.com/Lysxia/first-class-families)!