LINUX.ORG.RU

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

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

Нет, не видней.

Кхм, ничего не имею возразить :)

На практике нужно.

На практике их нет. Не напишешь ты общий интерфейс на каждый чих.

Ты говоришь о сферическом в вакууме программировании.

Нет ты. Ещё раз — если интерфейсов нет, то никакой передачи одного типа на место аргумента который (в статике) ждёт другой быть не может, так что не понятно что ты собрался конвертировать во что. А если интерфейсы ООП, концепты обобщённого программирования или теории зависимых типов есть, и Вася с Петей написали зачем-то в рамках одного проекта два таких, решающих схожие задачи, то кому-то придётся их совмещать — так это не проблема зависимых типов, и непонятно почему ты думаешь, что в их случае конвертировать теории это накладно (я пробовал в агде — те же тривиальные враперы, а там много теорий в Algebra.* и Сategories.*, например).

Гора аннотаций осталась.

Откуда гора? «Ты говоришь о сферическом в вакууме программировании». Если я хочу гарантии для operator[](size_t i) для std::array<T, n>, то не гора, а добавление только <less<i, n>> после круглых скобок и вызовы вида if (i < n) { ... x[i]; ... } else { ... x[i]; <- static error ... } (operator<, less и bool должны быть связаны, dependent-if должен создавать контекст с пруфом, сами свидетели в угловых скобках после круглых в данном случае стираются во время компиляции). А если не хочу — будет как было.

Ну также один в один.

#include <array>

template <typename T, size_t a, size_t b>
std::array<T, a + b> concat(std::array<T, a> const& x, std::array<T, b> const& y) {
    std::array<T, a + b> z;
    std::copy(x.begin(), x.end(), z.begin());
    std::copy(y.begin(), y.end(), z.begin() + x.size());
    return z;
}

#include <cstdio>

int main() {
    for (auto const& x : concat(std::array<int, 3>{{1, 2, 3}},
                                std::array<int, 2>{{4, 5}}))
        printf("%d\n", x);
}

давай на хаскеле98 компилируемый и работающий с main (массивы-аргументы можно сделать переменными, результат concat — тоже, с auto или без), а потом ещё почитаем ассемблер :).

Так в плюсах тоже не по term. n - это не терм, а тип, просто сахарок Zero/Succ на уровне типов.

Мы этого не знаем. А знаем мы, что n можно передать в обычную (constexpr) функцию на место аргумента с обычным типом std::size_t, так что таки терм.

с++, где захуячена макросистема на простой типизированной лямбде

Ага, с quote и defmacro, «макросистема шаблонов», блин. Это ложная предпосылка про шаблоны-макросы, так что я не комментирую дальше. Я dependnet product показал (concat для std::array), ссылка на википедию про то что LambdaP в лямбда кубе это уже зависимые типы — была, NList : Set → ℕ → Set — тоже показал, про type -> type, term -> type, type -> term в type-level (которые делаются не какими-то там макросами, а обычной рекурсией с выборами — структуры играют роль таких type-level рекурсивных функций, причём если посмотреть, то g++ и clang++ умеет для них оптимизации, так что код получается хороший в итоге) сказал, про стандартные type traits (типа is_same) — тоже. Так что тут вопрос обратный — что такого умеют шаблоны, что не вкладывается один в один в зависимые типы (потому что макросы умеют кучу всего, поэтому они к зависимым типам не имеют прямого отношения).

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

Нет, не видней.

Кхм, ничего не имею возразить :)

На практике нужно.

На практике их нет. Не напишешь ты общий интерфейс на каждый чих.

Ты говоришь о сферическом в вакууме программировании.

Нет ты. Ещё раз — если интерфейсов нет, то никакой передачи одного типа на место аргумента который (в статике) ждёт другой быть не может, так что не понятно что ты собрался конвертировать во что. А если интерфейсы ООП, концепты обобщённого программирования или теории зависимых типов есть, и Вася с Петей написали зачем-то в рамках одного проекта два таких, решающих схожие задачи, то кому-то придётся их совмещать — так это не проблема зависимых типов, и непонятно почему ты думаешь, что в их случае конвертировать теории это накладно (я пробовал в агде — те же тривиальные враперы, а там много теорий в Algebra.* и Сategories.*, например).

Гора аннотаций осталась.

Откуда гора? «Ты говоришь о сферическом в вакууме программировании». Если я хочу гарантии для operator[](size_t i) для std::array<T, n>, то не гора, а добавление только <less<i, n>> после круглых скобок и вызовы вида if (i < n) { ... x; ... } else { ... x; <- static error ... } (operator<, less и bool должны быть связаны, dependent-if должен создавать контекст с пруфом, сами свидетели в угловых скобках после круглых в данном случае стираются во время компиляции). А если не хочу — будет как было.

Ну также один в один.

#include <array>

template <typename T, size_t a, size_t b>
std::array<T, a + b> concat(std::array<T, a> const& x, std::array<T, b> const& y) {
    std::array<T, a + b> z;
    std::copy(x.begin(), x.end(), z.begin());
    std::copy(y.begin(), y.end(), z.begin() + x.size());
    return z;
}

#include <cstdio>

int main() {
    for (auto const& x : concat(std::array<int, 3>{{1, 2, 3}},
                                std::array<int, 2>{{4, 5}}))
        printf("%d\n", x);
}

давай на хаскеле98 компилируемый и работающий с main (массивы-аргументы можно сделать переменными, результат concat — тоже, с auto или без), а потом ещё почитаем ассемблер :).

Так в плюсах тоже не по term. n - это не терм, а тип, просто сахарок Zero/Succ на уровне типов.

Мы этого не знаем. А знаем мы, что n можно передать в обычную (constexpr) функцию на место аргумента с обычным типом std::size_t, так что таки терм.

с++, где захуячена макросистема на простой типизированной лямбде

Ага, с quote и defmacro, «макросистема шаблонов», блин. Это ложная предпосылка про шаблоны-макросы, так что я не комментирую дальше. Я dependnet product показал (concat для std::array), ссылка на википедию про то что LambdaP в лямбда кубе это уже зависимые типы — была, NList : Set → ℕ → Set — тоже показал, про type -> type, term -> type, type -> term в type-level (которые делаются не какими-то там макросами, а обычной рекурсией с выборами — структуры играют роль таких type-level рекурсивных функций, причём если посмотреть, то g++ и clang++ умеет для них оптимизации, так что код получается хороший в итоге) сказал, про стандартные type traits (типа is_same) — тоже. Так что тут вопрос обратный — что такого умеют шаблоны, что не вкладывается один в один в зависимые типы (потому что макросы умеют кучу всего, поэтому они к зависимым типам не имеют прямого отношения).