加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala编译时递归?

发布时间:2020-12-16 18:17:48 所属栏目:安全 来源:网络整理
导读:由于我昨天发布了一个关于 Scala中元组的问题的一些有用的答案,我一直在寻找Scala HLists.我想从这个问题重新散列一个C示例来问另一个: 在C中,可以使用模板特化实现编译时递归.我经常对boost元组进行操作,像Scala / Haskell一样,HLists是通过多次组合泛型’
由于我昨天发布了一个关于 Scala中元组的问题的一些有用的答案,我一直在寻找Scala HLists.我想从这个问题重新散列一个C示例来问另一个:

在C中,可以使用模板特化实现编译时递归.我经常对boost元组进行操作,像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,const std::vector<std::string>& vals )
{
    return 1;
}

至关重要的是,这种模式通常用于你想为每种元组元素类型做一些不同的事情(我的例子中没有说明):在C编译时递归是必不可少的,因为一旦代码运行,类型信息就会丢失用于所有有用的目的.

我的问题是,与Scala HList有类似的可能性,例如:

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

我知道在JVM上运行的Scala具有反射功能 – 因此可以使用运行时递归和使用清单和模式匹配的函数来实现.但是我有兴趣知道是否有可能使用编译时递归来做类似于C的例子?

解决方法

是的,可以使用隐式参数实现编译时递归.看到:

http://apocalisp.wordpress.com/2010/06/08/type-level-programming-in-scala/
http://jnordenberg.blogspot.com/2008/08/hlist-in-scala.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读