3
votes

Existe-t-il un équivalent à l'itération de Haskell dans Rust?

itérer function applique à plusieurs reprises une fonction à une valeur pour générer une série de valeurs. Par exemple, appliquer (^ 2) à 2 génère 2, 2 ^ 2, 2 ^ 2 ^ 2, 2 ^ 2 ^ 2 ^ 2, ... (2, 4, 16, 256, ...)

Y a-t-il un équivalent dans Rust?


3 Réponses :



5
votes

Cela n’existe pas dans la bibliothèque standard, mais la caisse itertools a itérer

Crée un nouvel itérateur qui applique une fonction à l'infini à la valeur et donne des résultats.

use itertools::iterate;

itertools::assert_equal(iterate(1, |&i| i * 3).take(5), vec![1, 3, 9, 27, 81]);


0 commentaires

1
votes

À partir de Rust 1.34 , vous pouvez utiliser std::iter::successors

Donc pour ce problème, vous feriez quelque chose comme ceci:

parc

use std::iter::successors;

fn main() {
    let v = successors(Some(2_u128), |n| n.checked_mul(*n)).collect::<Vec<_>>();
    assert_eq!(v, vec![2, 4, 16, 256, 65536, 4294967296, 18446744073709551616]);

    for i in successors(Some(2_u128), |n| n.checked_mul(*n)) {
        println!("{}", i);
    }
}

Regardez aussi std :: iter :: from_fn a>, cela peut être un peu plus puissant.


0 commentaires