簡體   English   中英

Scala編譯時遞歸?

[英]Scala compile-time recursion?

作為對我昨天發布的有關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, int index, const std::vector<std::string>& vals )
{
    return 1;
}

至關重要的是,這種模式通常用於您要為各種元組元素類型中的每一個做不同的事情的情況下(在我的示例中未說明):在C ++中,編譯時遞歸是必不可少的,因為一旦代碼運行,類型信息就會丟失用於所有有用的目的。

我的問題是,Scala HList是否有可能類似的事情,例如

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

我知道在JVM上運行的Scala具有反射功能-因此大概可以使用帶有清單和模式匹配功能的運行時遞歸來實現。 但是我有興趣知道是否可以使用編譯時遞歸來進行類似於C ++示例的操作?

約書亞·蘇瑞斯(Joshua Suereth)的新書《深度的斯卡拉》(Scala in Depth)中有一個很好的例子。 第7.4節是“使用類型系統進行有條件的執行”,它介紹了HList構造以及如何使用編譯時遞歸來實現可以訪問HList特定元素的IndexedView類型。 這用於實現AtIndex類型,該類型用於在編譯時檢索單個值。

是的你可以。 在最普通的情況下,請參閱我的博客文章有關如何在Scala的類型系統中實現SKI演算 我還寫了關於循環展開和條件編譯的更具體情況。 最后,這個小難題解決方案顯示了一種實現編譯時間遞歸的方法的本質。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM