ava/notes/standard-type-classes.md

2.7 KiB

Standard Type Classes

given A
class Semigroup
    defn combine: A -> A -> A
end class

given A :: Semigroup
class Monoid
    defn empty: A
end class

--- Type class for type constructors which can be mapped over.
---
--- ## Laws
---
--- **Composition**: `fa -> f -> g = fa -> (f ∘ g)`
--- **Identity**: `fa -> ((x) => x) = fa`
given F *
class Functor
    --- Transform some wrapped data from one type to another, preserving the
    --- wrapper.
    ---
    --- @tparam A The type of input data.
    --- @tparam B The type of output data.
    --- @param fa The functor input.
    --- @param f The function to transform data from `A` to `B`.
    given A, B
    defn map: F A -> (A -> B) -> F B
end class

given F * :: Functor
class Apply
    given A, B
    defn ap: F (A -> B) -> F A -> F B
end class

given F * :: Apply
class Applicative
    given A
    defn pure: A -> F A

    fn unit: F #()
        λ => pure #()
    end fn
end class

--- Any Applicative satisfies Functor.
given F * :: Applicative
instance Functor F
    given A, B
    fn map: F A -> (A -> B) -> F B
        λ fa f => ap (pure f) fa
    end fn
end instance

given F * :: Apply
class FlatMap
    given A, B
    defn fmap: F A -> (A -> F B) -> F B

    given A
    fn flatten: F (F A) -> F A
        λ ffa => fmap ffa (fa => fa)
    end fn
end class

given F * :: FlatMap, Applicative
class Monad
end class

given F * :: Monad
instance Functor F
    fn map: F A -> (A -> B) -> F B
        λ fa f => fmap fa (λ a => pure (f a))
    end fn
end instance

given F * *
class Bifunctor
    given A, B, C, D
    defn bimap F A B -> (A -> C) -> (B -> D) -> F C D
end class

given F * :: Functor
class CoFlatMap
    given A, B
    defn cofmap: F A -> (F A -> B) -> F B

    given A
    fn coflatten: F A -> F (F A)
        λ fa => cofmap fa (λ f => f)
    end fn
end class

given F * :: CoFlatMap
class CoMonad
    given A
    defn extract: F A -> A
end class

given A
class Show
    defn show: A -> String
end class

given A, B
class Eq
    defn eq: A -> B -> Boolean

    fn neq: A -> B -> Boolean
        λ x y => not (eq x y)
    end fn

    infix =: A -> B -> Boolean
        λ x y => eq x y
    end infix

    infix !=: A -> B -> Boolean
        λ x y => neq x y
    end infix
end class

enum Comparison
    object LessThan
    object EqualTo
    object GreaterThan
end enum

given A
class Compare
    defn compare: A -> A -> Comparison
end class

given A :: Compare
instance Eq A A
    fn eq: A -> A -> Boolean
        λ x y =>
            match compare x y
                case EqualTo => true
                case _       => false
            end match
    end fn
end instance

given A
class HashCode
    defn hash_code: A -> Int32
end class