暗黙のプログラミングの Haskell イディオムのいくつかは、Rust に翻訳可能ですか?
質問する
342 次
1 に答える
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));
}
マクロはおそらくもっと単純かもしれませんが、それが私が思いついたものです。
しかし、それは確かに言語自体ではサポートされていません。結局のところ、Rust は関数型言語でも連結型言語でもありません。
非常によく似たイディオムは、 Rust で完全にサポートされているmethod chainingです。最も顕著な例は、反復子の変換だと思います。
let v: ~[int] = ...;
let x: int = v.iter().map(|x| x + 1).filter(|x| x > 0).fold(0, |acc, x| acc + x/2);
確かに、任意関数合成ほど柔軟ではありませんが、より自然に見え、より便利に感じられます。
于 2014-02-20T18:45:05.573 に答える