Haskell có công cụ tra cứu chung tuyệt vời này cho phép bạn gọi một cái gì đó như map
trên mỗi nút trong bộ sưu tập, từ dưới lên hoặc từ trên xuống dưới. Nó được gọi là everywhere
và bạn sẽ làm một cái gì đó như everywhere f tree
và f
sẽ được gọi trên mỗi nút trong cây của bạn.Phế liệu Boilerplate của bạn tương đương với Scala?
Viết nội dung nào đó tương đương trong Scala cho Traversable
thật dễ dàng, nhưng Haskell cũng hoạt động trên bộ dữ liệu và tương đương với các kiểu chữ hoặc, thông thường hơn, những gì Scala gọi Product
s.
Bạn có thể đi qua trên các yếu tố trong một Product
sử dụng phương pháp productIterator
, nhưng có một số cách đơn giản để đặt một tuple hoặc một lớp hợp lại với nhau một khi bạn biết những gì các đối số cho các nhà xây dựng (trên thực tế, tôi đoán apply
phương pháp) nên được?
def mapOnProduct[X](f: X -> X, prod: Product) {
val newArgs = prod.productIterator.map {
case x: X => f(x)
case id => id
}.toList
[?].apply(newArgs: _*)
}
Tôi có thể thay thế [?]
để điều này có một số cơ hội hoạt động?
Cảm ơn!
Chính xác những gì tôi đang tìm kiếm. Cảm ơn! – TOB
Điều này có thể mất một trường hợp tùy ý và trả về một cá thể mới dựa trên chức năng của các tham số của nó, và làm việc với tất cả các trường hợp của Sản phẩm, hay nó chỉ giới hạn trong các bộ dữ liệu? –
@LuigiPlinge: điều này cũng hoạt động với các trường hợp lớp học, ít nhất là từ shapeless 2.0, nhờ vào macro. Một ví dụ đẹp hơn là [ở đây] (https://github.com/milessabin/shapeless/blob/e3399e35a7bb17b286141f53827619a3dc98efe8/examples/src/main/scala/shapeless/examples/sybclass.scala#L65). – Blaisorblade