---
# System prepended metadata

title: Programming in Haskell (Powered by Category Theory)
tags: [hask, cat]

---

# Programming in Haskell (Powered by Category Theory)

###### tags: `cat` `hask`

[TOC]

## Ref.

https://en.wikibooks.org/wiki/Haskell/Category_theory
http://yogsototh.github.io/Category-Theory-Presentation/categories.html#slide-0

## Basic Types, Classes

### Types

1. Basic types: `Bool`, `Char`, `String`, `Int`, `Integer`, `Float`, `Double`
2. List types: `[T]`
3. Tuple types: `(T1, T2, ...Tn)` ($n \neq 1$)
4. Function Types: `T1 -> T2`
5. Polymorphic Types: A type that contains one or more *type variables* `a`
    * ex: `length :: [a] -> Int` `id :: a -> a`
6. Overloaded types:  A type that contains one or more *class constraints* `C a`
    * ex: `(+) :: Num a => a -> a -> a`  ...for any type `a` that is an instance of the class `Num`, the function `(+)` has type `a -> a -> a`.
    * ex: `3 :: Num a => a`

### Classes

1. `Eq` - equality types, supporting
    * `(==) :: a -> a -> Bool`
    * `(/=) :: a -> a -> Bool`
2. `Ord` - ordered types, supporting
    * `(<) :: a -> a -> Bool`
    * ...and similarly `>`, `<=`, `>=`, `min`, `max`
3. `Show` - showable types, supporting
    * `show :: a -> String`
4. `Read` - readable types, supporting
    * `read :: String -> a`
5. `Num` - numeric types, supporting
    * `(+)`, `(-)`, `(*)` `:: a -> a -> a`
    * `negate`, `abs`, `signum` `:: a -> a`
6. `Integral`
7. `Fractional`

## Declaring Types, Classes

### **Type** Declarations

* `type String = [Char]`
* `type Pos = (Int,Int)`
* `type Pair a = (a,a)`
* `type Assoc k v = [(k,v)]`

### **Data** Declarations

* `data Bool = False | True`
* `data Move = North | Source | East | West`
* `data Shape = Circle Float | Rect Float Float`

---

## Terminoligy

* *unit*, *return*, *pure* `return :: d -> m d`
* *counit*, *extract* `extract :: w c -> c`

---
