22 个版本 (8 个重大更新)
0.8.3 | 2023 年 6 月 15 日 |
---|---|
0.7.0 | 2023 年 6 月 12 日 |
#737 in Rust 模式
每月 1,021 次下载
60KB
1.5K SLoC
Rust 中的函子(及函子)
此包提供了 Rust 中的函子和函子。API 设计允许对内部类型添加额外的限制,从而允许为 std::collections 中的所有集合实现一个通用的 Functor
特性,包括那些在其相关方法上具有 Eq + Hash
或 Ord
限制的集合。
此包还包含了对boxed迭代器、futures和函数的Functor
和Monad
实现。
lib.rs
:
Rust 中的函子和函子
注意: 此包有一些限制。请务必阅读下面的“注意事项”部分。
函子
以下特性用于描述函子
Functor
是一个泛型特性,它提供了一个fmap
方法,这是Option::map
、Result::map
等等的泛化,并且它在标准库中的许多类型上得到了实现。FunctorSelf
是Functor
的一个特殊情况,其中类型在映射时不会改变。它通过空白实现自动实现,并且在映射类型到自身时必须添加为一个限制。FunctorMut
是FunctorSelf
的一个特殊情况,其fmap_mut
方法在&mut self
上操作。它不是自动实现的,但此包为在标准库中实现Functor
的所有类型提供了实现。
反变函子
以下特性被用来描述逆变函子,例如,一个可以被转换成 Writer<A>
的 Writer<B>
,通过一个 Fn(A) -> B
函数。
Contravariant
(类似于Functor
)ContravariantSelf
(类似于FunctorSelf
)ContravariantMut
(类似于FunctorMut
)
单调子
Monad
特性描述了既是函子也是单调子的类型。其超特性 Pure
允许包装单个值。(Pure::pure
等同于单调子上下文中通常所说的 "return")。嵌套单调子通过泛型实现实现了 NestedMonad
。
应用函子
有关应用函子,请参阅 Applicative
特性。
注意事项
从这个crate的特性定义中,Rust无法总是推断类型相等或自动推断实现的特性。这可能会导致需要复杂的(可能是病毒性的)类型界限,这可能会极大地限制这个crate的可用性。
fn foo1<'a, T>(functor: T) -> T
where
T: Functor<'a, u16, Inner = u8>,
{
functor.fmap(|x| x as u16).fmap(|x| x as u8) // works
}
fn foo2<'a, T>(functor: T)
where
T: Functor<'a, u16, Inner = u8>,
T: Functor<'a, u32, Inner = u16>,
{
let _ = functor.fmap(|x| x as u16).fmap(|x| x as u32); // fails
}
fn foo3<'a, T>(functor: T)
where
T: Functor<'a, u16, Inner = u8>,
T::Mapped: Functor<'a, u32, Inner = u16>, // this is needed instead
{
let _ = functor.fmap(|x| x as u16).fmap(|x| x as u32);
}
还可以参阅 FunctorSelf
以在最简单的情况下找到一个解决方案。