В результате некоторых полезных ответов на вопрос, который я вчера опубликовал о кортежах в 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> > >
Затем мы можем написать пару функций, которые повторяются во время компиляции по этой структуре, завершаясь, когда втораяБолее специализированная функция соответствует финальному типу минусов.Простой пример подсчета количества элементов показан ниже:
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 ++, используя рекурсию во время компиляции?