在 Rust 中是否可以进行隐性编程



Haskell的一些隐性编程习语可以翻译成Rust吗?

您可以尝试为此构建一个宏:

#[feature(macro_rules)];
macro_rules! compose_inner(
    ($var:ident, $f:ident) => (
        $f($var)
    );
    ($var:ident, $f:ident $($rest:ident )+) => (
        $f(compose_inner!($var, $($rest )+))
    );
)

macro_rules! compose(
    ($($f:ident )+) => (
        |x| compose_inner!(x, $($f )+)
    )
)
fn foo(x: int) -> f64 {
    (x*x) as f64
}
fn bar(y: f64) -> ~str {
    (y+2.0).to_str()
}
fn baz(z: ~str) -> ~[u8] {
    z.into_bytes()
}
fn main() {
    let f = compose!(baz bar foo);
    println!("{:?}", f(10));
}

宏可能更简单,但这就是我想出的。

但它肯定不受语言本身的支持。毕竟,Rust 不是一种函数式语言,也不是连接式语言。

非常相似的习语是方法链接,Rust 绝对支持它。我认为,最突出的例子是迭代器转换:

let v: ~[int] = ...;
let x: int = v.iter().map(|x| x + 1).filter(|x| x > 0).fold(0, |acc, x| acc + x/2);

诚然,它不像任意函数组合那样灵活,但它看起来更自然,感觉更方便。

相关内容

  • 没有找到相关文章

最新更新