cat/instances/comonad
Comonad instances: Identity, NonEmpty, Tuple, Pair, and Reader.
Values
pub fn identity_comonad() -> comonad.Comonad(
types.IdentityF,
a,
b,
cat.Identity(a),
cat.Identity(b),
cat.Identity(cat.Identity(a)),
)
Comonad instance for Identity.
Examples
let double = fn(id: Identity(Int)) -> Int {
let Identity(x) = id
x * 2
}
Identity(5)
|> identity_comonad().extend(double)
// -> Identity(10)
pub fn non_empty_comonad() -> comonad.Comonad(
types.NonEmptyF,
a,
b,
cat.NonEmpty(a),
cat.NonEmpty(b),
cat.NonEmpty(cat.NonEmpty(a)),
)
Comonad instance for NonEmpty.
Examples
Next("a", Next("b", Leaf("c")))
|> non_empty_comonad().duplicate()
// -> Next(Next("a", Next("b", Leaf("c"))),
// Next(Next("b", Leaf("c")),
// Leaf(Leaf("c")))
fn sum(vec: NonEmpty(Int)) -> Int {
case vec {
Leaf(x) -> x
Next(x, v) -> x + sum(v)
}
}
Next(1, Next(2, Next(3, Leaf(4))))
|> non_empty_comonad().extend(sum)
// -> Next(10, Next(9, Next(7, Leaf(4))))
pub fn tuple_comonad() -> comonad.Comonad(
types.TupleF(c),
a,
b,
#(c, a),
#(c, b),
#(c, #(c, a)),
)
Comonad instance for Tuple.
Examples
#("hello", 5)
|> tuple_comonad().extract()
// -> 5
#("hello", 5)
|> tuple_comonad().duplicate()
// -> #("hello", #("hello", 5))
#("hello", 5)
|> tuple_comonad().extend(fn(p: #(String, Int)) { length(p.0) == p.1 })
// -> #("hello", True)