2012-05-02 36 views
7

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 treef 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!

Trả lời

6

Xem Shapeless Miles Sabin Shapeless. Có một ví dụ về cách sử dụng ở mọi nơi trong sybclass test

+0

Chính xác những gì tôi đang tìm kiếm. Cảm ơn! – TOB

+0

Đ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? –

+0

@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

Các vấn đề liên quan