Pull to refresh
16
0

Пользователь

Send message

А если это const generics? в расте к сожалению перегрузка по ним не работает.

Ну я пишу в определении внешней функции тип B или тип C, или их общий тип А, а то из дискуссий не понятно как она работает, буду рад для общей картины чуть подробнее увидеть пример.

А как сделать такое на хаскель: функция принимает какой то общий тип, но потом в теле функции надо вызвать нужную перегрузку другой функции в зависимости от типа изначального аргумента?

Во первых у вас (множественное число) в комментах смешался хаскель и раст. Как раз судя по статье в хаскеле не обязательно (поправьте если что я хаскель не знаю) указывать ограничение на типы аргументов функций и он может вывести их в некоторых случаях сам, а в раст обязательно. Допустим в статье хаскель понял что аргумент должен быть Foldable + Ord + Num.


Во вторых для завтипов есть вопрос, что все ограничения наверное будет сложно перечислять явно и лучше иметь функционал авто вывода этих ограничений, разве не так?

Давайте отделять мух от котлет т.е. прод от технологий и брать последний релиз компилятора за общий знаменатель.

1) Если есть одинаковые елементы
2) [56., 15., 10., 77.1, 55., 21., 11., 52., 47., 5., 41., 92., 26., 83., 27., 43., 88., 45., 77.2, 36.] например такой рандом

Результ исправленный

Ваш код работает не правильно

Не знаю про Хаскель к сожалению, имел ввиду что можно делать if constexpr или какой-то другой условный переход для мета программирования, что отличается от макросов раста, в том числе процедурных.

Есть один момент, что отличает плюсовые темплейты от манипуляторов AST — это интеграция с constexpr значениями.

Все равно императивное решение не догнать

А как будет работать RA итератор поверх отфильтрованного вектора? Хранить где-то индексы или фильтровать каждый раз заново?

Ну аллокаций все равно много, по вектору на каждый вызов рекурсии

чтобы было заметнее вставлю кодом с вашего позволения


vector<double> sort(vector<double> vec) {
  if(size(vec) <= 1) {
    return vec;
  } else {
    auto pivot = vec[size(vec) / 2];

    return concat_view(
      sort(vec | filter(_ < pivot)),
      vec | filter(_ == pivot),
      sort(vec | filter(_ > pivot))
    );
  }
}

на раст можно было так


fn sort_fun(arr: Vec<f64>) -> Vec<f64> {
    if arr.len() <= 1 {
        arr
    } else {
        let pivot = arr[arr.len() / 2];
        [
            sort_fun(arr.iter().filter(|&&x| pivot > x).cloned().collect()),
            arr.iter().filter(|&&x| pivot == x).cloned().collect(),
            sort_fun(arr.iter().filter(|&&x| pivot < x).cloned().collect()),
        ]
        .concat()
    }
}

Зачем писать swap когда он есть в std

Спасибо за подробности, но почему нельзя было просто subscribers.HandleEvent()... или сделать опять же initializer_list и обойти через for? Я очень редко использую variadic templates поэтому не знаю нюансов. Наверное первый мой вариант не скомпилируется а вот накладывает ли какие то дополнительные расходы второй я не знаю.

После этого ответа я подумал что опять не заметил что перевод, но нет :)

Ага, тогда у вас по сути девиртуализация через crtp только variadic crtp получился?

И другой вопрос почему не происходит девиртуализация в втором варианте? А если собирать lto или поставить final?

Information

Rating
5,071-st
Registered
Activity