22 个版本 (8 个重大更新)

0.8.3 2023 年 6 月 15 日
0.7.0 2023 年 6 月 12 日

#737 in Rust 模式

Download history 345/week @ 2024-03-13 219/week @ 2024-03-20 174/week @ 2024-03-27 172/week @ 2024-04-03 171/week @ 2024-04-10 117/week @ 2024-04-17 191/week @ 2024-04-24 222/week @ 2024-05-01 184/week @ 2024-05-08 212/week @ 2024-05-15 336/week @ 2024-05-22 222/week @ 2024-05-29 172/week @ 2024-06-05 345/week @ 2024-06-12 285/week @ 2024-06-19 179/week @ 2024-06-26

每月 1,021 次下载

MIT/Apache

60KB
1.5K SLoC

Rust 中的函子(及函子)

此包提供了 Rust 中的函子和函子。API 设计允许对内部类型添加额外的限制,从而允许为 std::collections 中的所有集合实现一个通用的 Functor 特性,包括那些在其相关方法上具有 Eq + HashOrd 限制的集合。

此包还包含了对boxed迭代器、futures和函数的FunctorMonad实现。


lib.rs:

Rust 中的函子和函子

注意: 此包有一些限制。请务必阅读下面的“注意事项”部分。

函子

以下特性用于描述函子

  • Functor 是一个泛型特性,它提供了一个 fmap 方法,这是 Option::mapResult::map 等等的泛化,并且它在标准库中的许多类型上得到了实现。
  • FunctorSelfFunctor 的一个特殊情况,其中类型在映射时不会改变。它通过空白实现自动实现,并且在映射类型到自身时必须添加为一个限制。
  • FunctorMutFunctorSelf 的一个特殊情况,其 fmap_mut 方法在 &mut self 上操作。它不是自动实现的,但此包为在标准库中实现 Functor 的所有类型提供了实现。

反变函子

以下特性被用来描述逆变函子,例如,一个可以被转换成 Writer<A>Writer<B>,通过一个 Fn(A) -> B 函数。

单调子

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 以在最简单的情况下找到一个解决方案。

无运行时依赖