gpt4 book ai didi

iterator - 在 map 闭包中生成新序列时出现奇怪的类型错误

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

我使用的策略来自 this question's answer ,我有兴趣生成另一个序列,它是迭代器映射创建的两个序列的函数:

extern crate itertools_num;

use itertools_num::linspace;

fn main() {
// 440Hz as wave frequency (middle A)
let freq: f64 = 440.0;
// Time vector sampled at 880 times/s (~Nyquist), over 1s
let delta: f64 = 1.0 / freq / 2.0;
let time_1s = linspace(0.0, 1.0, (freq / 2.0) as usize)
.map(|sample| { sample * delta});


let (sine_440,
sine_100,
summed_signal): (Vec<f64>, Vec<f64>, Vec<f64>) =
time_1s.map(|time_sample| {
let sample_440 = (freq * &time_sample).sin();
let sample_100 = (100.0 * &time_sample).sin();
let summed_sample = &sample_440 + &sample_100;

(sample_440, sample_100, summed_sample)
}).unzip();
}

如闭包所示,第三个信号是前两个信号的总和。令人困惑的是我得到的错误:

error[E0271]: type mismatch resolving `<[closure@src/main.rs:17:21: 23:10 freq:_] as std::ops::FnOnce<(f64,)>>::Output == (_, _)`
--> src/main.rs:23:12
|
23 | }).unzip();
| ^^^^^ expected a tuple with 3 elements, found one with 2 elements
|
= note: expected type `(f64, f64, f64)`
= note: found type `(_, _)`
= note: required because of the requirements on the impl of `std::iter::Iterator` for `std::iter::Map<std::iter::Map<itertools_num::Linspace<f64>, [closure@src/main.rs:11:14: 11:40 delta:_]>, [closure@src/main.rs:17:21: 23:10 freq:_]>`

error[E0308]: mismatched types
--> src/main.rs:17:9
|
17 | time_1s.map(|time_sample| {
| ^ expected a tuple with 3 elements, found one with 2 elements
|
= note: expected type `(std::vec::Vec<f64>, std::vec::Vec<f64>, std::vec::Vec<f64>)`
= note: found type `(_, _)`

我能理解类型错误,但为什么要完全忽略第三个元组项?

最佳答案

您可以根据 standard unzip 创建自定义 unzip3 实现:

trait IteratorUnzip3 {
fn unzip3<A, B, C, FromA, FromB, FromC>(self) -> (FromA, FromB, FromC) where
FromA: Default + Extend<A>,
FromB: Default + Extend<B>,
FromC: Default + Extend<C>,
Self: Sized + Iterator<Item=(A, B, C)>,
{
let mut ts: FromA = Default::default();
let mut us: FromB = Default::default();
let mut vs: FromC = Default::default();

for (t, u, v) in self {
ts.extend(Some(t));
us.extend(Some(u));
vs.extend(Some(v));
}

(ts, us, vs)
}
}

impl<A, B, C, T: Iterator<Item=(A, B, C)>> IteratorUnzip3 for T{}

fn main() {
let freq: f64 = 440.0;

let (sine_440, sine_100, summed_signal): (Vec<f64>, Vec<f64>, Vec<f64>) =
[1.0, 2.0, 3.0].iter().cloned()
.map(|time_sample| {
let sample_440 = (freq * &time_sample).sin();
let sample_100 = (100.0 * &time_sample).sin();
let summed_sample = &sample_440 + &sample_100;
(sample_440, sample_100, summed_sample)
}).unzip3();

println!("{:?}\n{:?}\n{:?}", sine_440, sine_100, summed_signal);
}

Playground

关于iterator - 在 map 闭包中生成新序列时出现奇怪的类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39969287/

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