Рекурсия Scala во время компиляции?

В результате некоторых полезных ответов на вопрос, который я вчера опубликовал о кортежах в Scala, я посмотрел на Scala HLists. Я хотел бы повторно хешировать пример C ++ из этого вопроса, чтобы задать другой:

В C ++ можно реализовать рекурсию времени компиляции, завершенную с помощью специализации шаблона. Я' Мы часто делали это, работая с кортежами повышения, которые, как и в Scala / Haskell HLists, создаются путем многократного составления универсального типа cons, по одному разу для каждого соответствующего типа и завершающегося с помощью null_type. Итак, это:

boost::tuple<int, std::string, float>

реализовано под капотом как:

cons<int, cons<std::string, cons<float, null_type> > >

Затем мы можем написать пару функций, которые рекурсируют во время компиляции по этой структуре, завершаясь, когда вторая, более специализированная функция соответствует окончательному типу cons. Простой пример подсчета количества элементов показан ниже:

template<typename T1, typename T2>
void countTupleElements( boost::tuples::cons<T1, T2>& tupleRec, int index, const std::vector<std::string>& vals )
{
    return 1 + countTupleElements( tupleRec.tail );
}

template<typename T>
void countTupleElements( boost::tuples::cons<T, boost::tuples::null_type>& tupleRec, int index, const std::vector<std::string>& vals )
{
    return 1;
}

Что особенно важно, этот шаблон часто используется в обстоятельствах, когда вы хотите сделать что-то другое для каждого из различных типов элементов кортежа (не показано в моем примере): в C ++ компиляция -временная рекурсия важна, так как после запуска кода информация о типе теряется для всех полезных целей.

Мой вопрос: что-то подобное возможно с Scala HList, например

val example = 1 :: 2.0 :: "Hello" :: "World" :: HNil

Я знаю, что Scala, работающий на JVM, имеет отражение - и поэтому, по-видимому, это можно было бы реализовать с помощью рекурсии времени выполнения с функцией, использующей манифесты и сопоставление с образцом. Но мне интересно узнать, можно ли сделать что-то подобное примеру C ++, используя рекурсию времени компиляции?

5
задан Alex Wilson 19 March 2011 в 21:57
поделиться