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 日 |
#1603 在 Rust 模式
25 每月下载量
在 4 crates 中使用
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 文档。
要求
您可以使用以下命令安装它们
$ 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