這個問題是關於斯卡拉做模式匹配和遞歸列表和其性能的方式。斯卡拉列表遞歸性能
如果我有一個遞歸在列表的功能,我在利弊相匹配,例如像做:
def myFunction(xs) = xs match {
case Nil => Nil
case x :: xs => «something» myFunction(xs)
}
在Haskell:
myFunction [] = []
myFunction (x:xs) = «something» : myFunction xs
我使用例如Haskell,我會用同樣的語義。我不認爲會有關於Haskell實現的任何問題,因爲這是簡單的,你對付列表的方式。對於一個長長的清單,哈斯克爾不會閃爍(我將與幾千個節點列表上操作)(我想雖然,我從來沒有嘗試過)。
但是,從我與斯卡拉了解,本場比賽的語句將調用不應用抽提法拆分列表周圍的利弊,並在例如延伸到無助於列表中的功能:
def myFunction(xs) = xs match {
case Nil => Nil
case x :: xs => x :: myFunction(xs)
}
在Haskell中:
myFunction [] = []
myFunction (x:xs) = x : myFunction xs
它會調用應用提取器方法將它重新組合起來。對於一長串名單,我想這將是非常昂貴的。
爲了說明這一點,在我的特定情況下,我想在遞歸字符列表和積累各種事情,其中輸入字符串是什麼,高達幾十千字節。
請問我真的叫構造函數和提取的遞歸的每一步,如果我想在遞歸一個長長的清單?還是有優化?或更好的方法來做到這一點?在這種情況下,我需要幾個累加器變量,很明顯,我不會只是被遞歸地在一個列表無所事事...
(請原諒我的哈斯克爾,我沒有寫過一行兩年。)
(是的,我要去尾遞歸。)
謝謝!是的,我寫的是尾遞歸,第二個片段就是一個不好的例子!我真正想要做的是將輸入字符串分割成基於一些非平凡功能的各種塊:結果是累加器不是任何映射或摺疊樣式輸出。 也許我試圖讓這個問題過於籠統,尋找一種我可以在這個特定情況下使用的一般模式。 – Joe
好吧,看看我添加的最後一個例子。 –
完美的,這回答了兩個方面。非常感謝你! – Joe