gpt4 book ai didi

rust - frunk 的 foldl 针对具有不同类型参数的相同特征的元素

转载 作者:行者123 更新时间:2023-11-29 08:32:11 26 4
gpt4 key购买 nike

我正在学习如何使用 frunk in Rust .

我有一个关于如何使用 foldl methodfolder 参数的问题针对具有相同特征但类型参数不同的元素。我在下面用 foldl 方法的看似冗余的 folder 参数(这个例子编译得很好)写了一个例子。

是否有更简单的方法将 static_forward 函数传递给 foldl

#[macro_use]
extern crate frunk;

trait Layer<InDim, OutDim> {
fn forward(&self, input: Vec<InDim>) -> Vec<OutDim>;

fn static_forward(input: Vec<InDim>, layer: &Self) -> Vec<OutDim> {
layer.forward(input)
}
}

struct FtoI {}
struct ItoF {}
struct FtoS {}

impl Layer<f32, i32> for FtoI {
fn forward(&self, input: Vec<f32>) -> Vec<i32> {
// In real case, converts the input to output.
vec![1, 2, 3]
}
}

impl Layer<i32, f32> for ItoF {
fn forward(&self, input: Vec<i32>) -> Vec<f32> {
// In real case, converts the input to output.
vec![1., 2., 3.]
}
}

impl Layer<f32, String> for FtoS {
fn forward(&self, input: Vec<f32>) -> Vec<String> {
// In real case, converts the input to output.
vec![String::from("Hello"), String::from("world")]
}
}

fn main() {
let vec_float = vec![1., 2., 3.];
# These elements share Layer trait with different type parameters
let layers = hlist![FtoI {}, ItoF {}, FtoS {}];

let r = layers.to_ref().foldl(
hlist![
// All of the element are same and seem redundant. Can this argument be simplified?
Layer::static_forward,
Layer::static_forward,
Layer::static_forward
],
vec_float,
);
/* This doesn't compile due to "type mismatch in function arguments "
let r = layers.to_ref().foldl(Layer::static_forward, vec_float);
*/
println!("result: {:?}", r);
}

最佳答案

从@1tgr 那里得到了关于使用宏的想法。下面是我的实现。这需要为每个可能调用的“N”手动定义“@cons”部分,并在宏参数中指定“3”。

我仍在寻找更好的解决方案。

macro_rules! hcons_repeat {
(@cons (0, $_e:expr))
=> { HNil };
(@cons (1, $e:expr))
=> { HCons{ head: $e, tail: hcons_repeat!(@cons (0, $e))}};
(@cons (2, $e:expr))
=> { HCons{ head: $e, tail: hcons_repeat!(@cons (1, $e))}};
(@cons (3, $e:expr))
=> { HCons{ head: $e, tail: hcons_repeat!(@cons (2, $e))}};
(@cons (4, $e:expr))
=> { HCons{ head: $e, tail: hcons_repeat!(@cons (3, $e))}};
(@cons (5, $e:expr))
=> { HCons{ head: $e, tail: hcons_repeat!(@cons (4, $e))}};
(@cons (6, $e:expr))
=> { HCons{ head: $e, tail: hcons_repeat!(@cons (5, $e))}};
(@cons (7, $e:expr))
=> { HCons{ head: $e, tail: hcons_repeat!(@cons (6, $e))}};
[$e:expr; $n:tt] => {
{
hcons_repeat!(@cons ($n, $e))
}
};
}

...

let r = layers
.to_ref()
.foldl(hcons_repeat![Layer::static_forward; 3], vec_float);

关于rust - frunk 的 foldl 针对具有不同类型参数的相同特征的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53673834/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com