cat/instances/functor
Functor
instances: Option, List, Reader, Writer, Const, Tuple, Triple, Pair, Either.
Values
pub fn const_functor(
,
) -> functor.Functor(
types.ConstF(c),
a,
b,
cat.Const(c, a),
cat.Const(c, b),
)
Const Functor Instance
.
// Haskell instance
instance Functor (Const c) where
fmap :: (a -> b) -> Const c a -> Const c b
fmap _ (Const v) = Const v
Examples
const_functor().fmap(int.to_string)(Const(True))
// -> Const(True)
pub fn either_functor(
,
) -> functor.Functor(
types.EitherF(e),
a,
b,
cat.Either(e, a),
cat.Either(e, b),
)
Either Functor
.
Examples
either_functor().fmap(bool.negate)(Left(27))
// -> Left(27)
either_functor().fmap(bool.negate)(Right(False))
// -> Right(True)
pub fn function_functor(
,
) -> functor.Functor(
types.FunctionF(r),
a,
b,
fn(r) -> a,
fn(r) -> b,
)
(->) Functor Instance
.
// Haskell instance
instance Functor ((->) r) where
fmap :: (a -> b) -> (r -> a) -> (r -> b)
fmap f g = f ∘ g
Examples
let f = fn(x) { x % 2 == 0 }
let g = bool.to_string
function_functor().fmap(g)(f)(19)
// -> "False"
pub fn identity_functor(
,
) -> functor.Functor(
types.IdentityF,
a,
b,
cat.Identity(a),
cat.Identity(b),
)
Identity Functor Instance
.
// Haskell implementation
instance Functor Maybe where
fmap :: (a -> b) -> Identity a -> Identity b
fmap f (Identity x) = Identity(f x)
Examples
let f = fn(x: Int) -> Bool { x % 2 == 0 }
identity_functor().fmap(f)(Identity(5))
// -> Identity(False)
pub fn list_functor(
,
) -> functor.Functor(types.ListF, a, b, List(a), List(b))
List Functor Instance
.
// Haskell instance
instance Functor [] where
fmap :: (a -> b) -> [a] -> [b]
fmap _ [] = []
fmap f (x:xs) = (f x):(fmap f xs)
Examples
list_functor().fmap(int.to_string)([1, 3, 4])
// -> ["1", "3", "4"]
pub fn option_functor(
,
) -> functor.Functor(
types.OptionF,
a,
b,
option.Option(a),
option.Option(b),
)
Option Functor Instance
(generic over a and b).
// Haskell instance
instance Functor Maybe where
fmap :: (a -> b) -> Maybe a -> Maybe b
fmap _ Nothing = Nothing
fmap f (Just x) = Just (f x)
Examples
let double = fn(x) { x * 2 }
option_functor().fmap(double)(None)
// -> None
Some(2)
|> option_functor().fmap(double)
// -> Some(4)
pub fn pair_functor(
,
) -> functor.Functor(
types.PairF(c),
a,
b,
cat.Pair(c, a),
cat.Pair(c, b),
)
Pair Functor
.
Examples
pair_functor().fmap(bool.negate)(Pair(9, False))
// -> Pair(9, True)
pub fn reader_functor(
,
) -> functor.Functor(
types.ReaderF(r),
a,
b,
cat.Reader(r, a),
cat.Reader(r, b),
)
Reader Functor Instance
.
// Haskell implementation
instance Functor (Reader r) where
fmap :: (a -> b) -> Reader r a -> Reader r b
fmap f g = f ∘ g
Examples
let ra = Reader(fn(x) { x % 2 == 0 })
let f = bool.to_string
reader_functor().fmap(f)(ra).apply(19)
// -> "False"
pub fn result_functor(
,
) -> functor.Functor(
types.ResultF(e),
a,
b,
Result(a, e),
Result(b, e),
)
Result Functor Instance
.
Examples
result_functor().fmap(int.to_string)(Ok(72))
// -> Ok("72")
result_functor().fmap(int.to_string)(Error("Not a number"))
// -> Error("Not a number")
pub fn triple_functor(
,
) -> functor.Functor(
types.TripleF(c, d),
a,
b,
#(c, d, a),
#(c, d, b),
)
Triple Functor
.
Examples
triple_functor().fmap(bool.negate)(#("abc", 9, False))
// -> #("abc", 9, True)
pub fn tuple_functor(
,
) -> functor.Functor(types.TupleF(c), a, b, #(c, a), #(c, b))
Tuple Functor
.
Examples
tuple_functor().fmap(bool.negate)(#(9, False))
// -> #(9, True)
pub fn writer_functor(
,
) -> functor.Functor(
types.WriterF,
a,
b,
cat.Writer(a),
cat.Writer(b),
)
Writer Functor Instance
.
// Haskell Instance
fmap :: (a -> b) -> Writer a -> Writer b
fmap f = id >=> (\x -> return (f x))
Examples
monad.Writer(16, "message")
|> writer_functor().fmap(fn(x) { x % 4 == 0 })
// -> monad.Writer(True, "message")