3
是否有一些Haskell的成語tacit programming可譯爲Rust?是否可以在Rust中進行默認編程?
是否有一些Haskell的成語tacit programming可譯爲Rust?是否可以在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));
}
宏可能會更簡單,但是這就是我想出了。
但語言本身並不支持它。畢竟,生鏽並不是一種功能性和連續性的語言。
非常相似的成語是方法鏈接,這是絕對支持的鏽。最突出的例子,我想,讓迭代器轉換:
let v: ~[int] = ...;
let x: int = v.iter().map(|x| x + 1).filter(|x| x > 0).fold(0, |acc, x| acc + x/2);
誠然,這是不是任意函數組成靈活,但它看起來更自然,感覺方便多了。