2012-05-02 30 views
7

Haskell有這個很酷的泛型遍歷東西,可以讓你在集合中的每個節點上調用類似於map的東西,無論是自下而上還是自上而下。它被稱爲everywhere,你會做一些像everywhere f treef將在樹中的每個節點上調用。在Scala中廢除您的Boilerplate等效物?

在Scala中編寫相當於Traversable的東西很容易,但Haskell也適用於元組和類案例類,或者更一般地說Scala稱之爲Product s。

可以使用productIterator方法遍歷了在Product的元素,但有一些簡單的方法來把一個元組或一個案例類重新走到一起,一旦你知道什麼參數的構造函數(實際上,我猜apply方法)應該是?

def mapOnProduct[X](f: X -> X, prod: Product) { 
    val newArgs = prod.productIterator.map { 
    case x: X => f(x) 
    case id => id 
    }.toList 
    [?].apply(newArgs: _*) 
} 

我可以用[?]來代替[?]這樣就有一定的工作機會了嗎?

謝謝!

回答

6

請參閱Miles Sabin's Shapeless Shapeless。有一個在任何地方使用的例子sybclass test

+0

正是我在找什麼。謝謝! – TOB

+0

這可以採取任意的case類,並根據其參數的函數返回一個新的實例,並且可以處理Product的所有實例,還是僅限於元組? –

+0

@LuigiPlinge:這也適用於案例類,至少從無定形2.0開始,這要歸功於宏。一個更好的例子是[這裏](https://github.com/milessabin/shapeless/blob/e3399e35a7bb17b286141f53827619a3dc98efe8/examples/src/main/scala/shapeless/examples/sybclass.scala#L65)。 – Blaisorblade