7
Haskell有這個很酷的泛型遍歷東西,可以讓你在集合中的每個節點上調用類似於map
的東西,無論是自下而上還是自上而下。它被稱爲everywhere
,你會做一些像everywhere f tree
和f
將在樹中的每個節點上調用。在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: _*)
}
我可以用[?]
來代替[?]
這樣就有一定的工作機會了嗎?
謝謝!
正是我在找什麼。謝謝! – TOB
這可以採取任意的case類,並根據其參數的函數返回一個新的實例,並且可以處理Product的所有實例,還是僅限於元組? –
@LuigiPlinge:這也適用於案例類,至少從無定形2.0開始,這要歸功於宏。一個更好的例子是[這裏](https://github.com/milessabin/shapeless/blob/e3399e35a7bb17b286141f53827619a3dc98efe8/examples/src/main/scala/shapeless/examples/sybclass.scala#L65)。 – Blaisorblade