LINUX.ORG.RU

История изменений

Исправление red75prim, (текущая версия) :

Ну напишите.

Сначала ответьте на вопрос ниже.

Я прошу вас реализовать хотя бы какое-то подобие вариадика, вы мне пишете все тот же мономорфный код от двух переменных

Расскажите подробно, каким образом полиморфная функция Zip::zip(self), принимающая типы вида (T1, ()), (T1, (T2, ())), (T1, (T2, (T3, ()))), - это «мономорфная функция от двух переменных».

Она никак не может быть мономорфной (так как принимает на вход разные типы). У ней один аргумент: self.

Вот её реализация, на всякий случай.

trait Zip {
    type Out;
    fn zip(self) -> Self::Out;
}

impl<T, U: Zip> Zip for (T, U) {
    type Out = Iter<(T, U::Out)>;
    fn zip(self) -> Self::Out {
        let (t, u) = self;
        Iter((t, U::zip(u)))
    }
}

impl Zip for () {
    type Out = Iter<()>;
    fn zip(self) -> Self::Out {
        Iter(())
    }
}

Если бы была поддержка деконструирования туплов, то 6-я строка выглядела бы как

impl<T, U: Zip> Zip for (T, U...) {

А вызов: Zip::zip((a, b, c))

Исправление red75prim, :

Ну напишите.

Сначала ответьте на вопрос ниже.

Я прошу вас реализовать хотя бы какое-то подобие вариадика, вы мне пишете все тот же мономорфный код от двух переменных

Расскажите подробно, каким образом полиморфная функция Zip::zip(self), принимающая типы вида (T1, ()), (T1, (T2, ())), (T1, (T2, (T3, ()))), - это «мономорфная функция от двух переменных».

Она никак не может быть мономорфной (так как принимает на вход разные типы). У ней один аргумент: self.

Вот её реализация, на всякий случай.

trait Zip {
    type Out;
    fn zip(self) -> Self::Out;
}

impl<T, U: Zip> Zip for (T, U) {
    type Out = Iter<(T, U::Out)>;
    fn zip(self) -> Self::Out {
        let (t, u) = self;
        Iter((t, U::zip(u)))
    }
}

impl Zip for () {
    type Out = Iter<()>;
    fn zip(self) -> Self::Out {
        Iter(())
    }
}

Исправление red75prim, :

Ну напишите.

Сначала ответьте на вопрос ниже.

Я прошу вас реализовать хотя бы какое-то подобие вариадика, вы мне пишете все тот же мономорфный код от двух переменных

Расскажите подробно, каким образом полиморфная функция Zip::zip(self), принимающая типы вида (T1, ()), (T1, (T2, ())), (T1, (T2, (T3, ()))), - это «мономорфная функция от двух переменных».

Она никак не может быть мономорфной (так как принимает на вход разные типы). У ней один аргумент: self.

Вот её реализация, на всякий случай.

trait Zip {
    type Out;
    fn zip(self) -> Self::Out;
}

impl<T, U: Zip> Zip for (T, U) {
    type Out = Iter<(T, U::Out)>;
    fn zip(self) -> Self::Out {
        let (t, u) = self;
        Iter((t, U::zip(u)))
    }
}

impl Zip for () {
    type Out = Iter<()>;
    fn zip(self) -> Self::Out {
        Iter(())
    }
}

Исходная версия red75prim, :

Ну напишите.

Сначала ответьте на вопрос ниже.

Я прошу вас реализовать хотя бы какое-то подобие вариадика, вы мне пишете все тот же мономорфный код от двух переменных

Расскажите подробно, каким образом полиморфная функция Zip::zip(self), принимающая типы вида (T1, ()), (T1, (T2, ())), (T1, (T2, (T3, ()))), - это «мономорфная функция от двух переменных».

Она никак не может быть мономорфной (так как принимает на вход разные типы). У ней один аргумент: self.