#closures #monoid #functional #stackless

morphism

在 Rust 中用于挂起闭包组合的结构

7 个不稳定版本

使用旧的 Rust 2015

0.4.1 2016 年 6 月 22 日
0.4.0 2015 年 8 月 12 日
0.3.0 2015 年 2 月 22 日
0.2.2 2015 年 2 月 9 日
0.0.1 2014 年 11 月 22 日

#1603Rust 模式

25 每月下载量
4 crates 中使用

MIT 许可证

12KB
175

morphism.rs

在 Rust 中用于挂起闭包组合的结构

概要

“Morphism”的动机是为组合和评估任意数量的(在堆限制内)闭包提供一种方法,而不会耗尽栈空间。换句话说,“Morphism”是绕过 Rust 中缺乏尾调用优化的方法之一。

由于“Morphism”实现了“Fn”特质,它就像一个正常的闭包一样可以被调用,甚至可以像闭包一样传递。下面第二个示例展示了如何使用“Morphism”与迭代器一起使用。

示例

  • 将“Morphism”与闭包或另一个“Morphism”组合
let mut f = Morphism::new::<u64>();
for _ in range(0u64, 100000u64) {
    f = f.tail(|x| x + 42u64);
}

let mut g = Morphism::new::<Option<u64>>();
for _ in range(0u64,  99999u64) {
    g = g.tail(|x| x.map(|y| y - 42u64));
}

// type becomes Morphism<u64, (Option<u64>, bool, String)> so rebind g
let g = g
    .tail(|x| (x.map(|y| y + 1000u64), String::from_str("welp")))
    .tail(|(l, r)| (l.map(|y| y + 42u64), r))
    .tail(|(l, r)| (l, l.is_some(), r))
    .head(|x| Some(x));

let h = f.then(g);

assert_eq!(h(0u64), (Some(1084), true, String::from_str("welp")));
assert_eq!(h(1000u64), (Some(2084), true, String::from_str("welp")));
  • 当期望一个“Fn”-like时,用“Morphism”代替闭包
use std::iter::AdditiveIterator;

let mut f = Morphism::new::<u64>();
for _ in range(0u64, 10000) {
    f = f.tail(|x| x + 42);
}

// ::map treats f like any other Fn
let res = range(0u64, 100).map(f).sum();

assert_eq!(res, 42004950);

文档

请参阅此处的 API 文档。

要求

  1. Rust
  2. Cargo

您可以使用以下命令安装它们

$ curl -s https://static.rust-lang.org/rustup.sh | sudo sh

有关安装 Rust 的详细信息,请参阅安装 Rust

用法

$ cargo build       ## build library and binary
$ cargo test        ## run tests in ./tests
$ cargo bench       ## run benchmarks in ./benches

无运行时依赖