2014-02-20 2 views

ответ

6

Вы можете попробовать создать макрос для этого:

#[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)); 
} 

макросы, вероятно, может быть проще, но вот что я придумал.

Но это, безусловно, не поддерживается в самом языке. В конце концов, ржавчина не является функциональным и конкатенативным языком.

Очень похожая идиома метод цепочки, который абсолютно поддерживается ржавчиной. Наиболее яркий пример, я думаю, будет итераторы преобразования:

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

Правда, это не так гибко, как произвольная функция композиция, но выглядит гораздо более естественно и чувствует себя гораздо более удобным.

Смежные вопросы