Scala编译时递归?

Scala编译时递归?,scala,recursion,metaprogramming,hlist,Scala,Recursion,Metaprogramming,Hlist,对于我昨天发布的一个关于Scala中元组的问题,有了一些有用的答案,我一直在看Scala列表。我想重新从这个问题中重新给出一个C++例子来问另一个: 在C++中,可以使用模板特化来实现编译时递归。我经常在boost元组上执行此操作,它与Scala/Haskell HLists一样,是通过多次组合泛型“cons”类型构建的,每个相关类型一次,并以null_类型终止。因此: boost::tuple<int, std::string, float> 我知道在JVM上运行的Scala具有

对于我昨天发布的一个关于Scala中元组的问题,有了一些有用的答案,我一直在看Scala列表。我想重新从这个问题中重新给出一个C++例子来问另一个:

在C++中,可以使用模板特化来实现编译时递归。我经常在boost元组上执行此操作,它与Scala/Haskell HLists一样,是通过多次组合泛型“cons”类型构建的,每个相关类型一次,并以null_类型终止。因此:

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

我知道在JVM上运行的Scala具有反射,因此可以使用运行时递归和使用清单和模式匹配的函数来实现反射。但是我很想知道是否可以用编译时递归来做类似于C++示例的事情?p> 是的,可以使用隐式参数实现编译时递归。见:



约书亚·苏雷思(Joshua Suereth)的新书《深度Scala》中有一个很好的例子。第7.4节是“使用类型系统的条件执行”,它介绍了HList构造,以及如何使用编译时递归实现可以访问HList的特定元素的IndexedView类型。这用于实现一个AtIndex类型,该类型用于在编译时检索单个值。

可以。关于如何在Scala的类型系统中实现最一般的情况,请参阅我的博客文章。我还写了一个更具体的案例。最后,这个小例子展示了编译时递归如何实现的一种方法的本质

我不确定这里问的是什么。但考虑到你们问题的总体趋势,我想知道你们是否看过关于Scala类型系统中教堂数字的博客?还是Scala型系统中的滑雪演算?谢谢Daniel。事实证明,你的各种建议非常有用。我还在ScalaQuery的源代码中寻找灵感。你能添加一个更有趣的例子吗“你想为不同的元组元素类型做一些不同的事情”?
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;
}
val example = 1 :: 2.0 :: "Hello" :: "World" :: HNil