2011-12-01 27 views
6

Tôi là người mới bắt đầu Scala và muốn có một số lời khuyên về cách tiến hành triển khai có vẻ như có thể thực hiện với chức năng trả về Tùy chọn hoặc với PartialFunction. Tôi đã đọc tất cả các bài viết liên quan tôi có thể tìm thấy (xem dưới cùng của câu hỏi), nhưng những dường như liên quan đến các chi tiết kỹ thuật của việc sử dụng PartialFunction hoặc chuyển đổi một đến khác; Tôi đang tìm kiếm một câu trả lời của loại "nếu hoàn cảnh là X, Y, Z, sau đó sử dụng A khác B, nhưng cũng xem xét C".Scala: chọn chức năng trả về Tùy chọn so với PartialFunction

Trường hợp sử dụng mẫu của tôi là tìm kiếm đường dẫn giữa các vị trí bằng cách sử dụng thư viện công cụ tìm đường dẫn. Giả sử các vị trí có loại L, một đường dẫn thuộc loại P và kết quả tìm kiếm đường dẫn mong muốn sẽ là Iterable[P]. Kết quả tìm kiếm bản vá nên được lắp ráp bằng cách yêu cầu tất cả các công cụ tìm đường dẫn (như Google maps có thể là Xe đạp, Xe hơi, Đi bộ, Tàu điện ngầm, v.v.) cho các đề xuất về đường dẫn của chúng, có thể hoặc không được xác định cho một khởi đầu cụ thể/cặp vị trí kết thúc.

Dường như có hai cách để đi về điều này:

(a) định nghĩa một công cụ tìm con đường như f: (L,L) => Option[P] và sau đó nhận được kết quả thông qua một cái gì đó giống như finders.map(_.apply(l1,l2)).filter(_.isDefined).map(_.get)

(b) xác định một công cụ tìm con đường như f: PartialFunction[(L,L),P] and then get the result via something like finders.filter (_.isDefined ((l1, l2))) .map (_.apply ((l1, l2))) `

Dường như sử dụng hàm trả về Option[P] sẽ tránh đánh giá gấp đôi kết quả, vì vậy để tính toán đắt tiền, điều này có thể thích hợp hơn trừ khi người dùng lưu trữ kết quả. Nó cũng có vẻ như sử dụng Option một có thể có một chữ ký đầu vào tùy ý, trong khi PartialFunction mong đợi một đối số duy nhất. Nhưng tôi đặc biệt quan tâm đến việc nghe từ một người có kinh nghiệm thực tế về những cân nhắc ít hơn, nhiều hơn "hình ảnh lớn hơn", chẳng hạn như sự tương tác với thư viện Scala. Việc sử dụng một PartialFunction có lợi ích đáng kể trong việc cung cấp các phương thức nhất định của API thu thập có thể trả theo những cách khác không? Mã như vậy thường ngắn gọn hơn?

liên quan nhưng khác nhau câu hỏi:

Trả lời

3

Nó cảm thấy s như Option có thể phù hợp với trường hợp sử dụng của bạn tốt hơn.

Giải thích của tôi là các hàm một phần hoạt động tốt để được kết hợp trên phạm vi nhập liệu. Vì vậy, nếu f được xác định trên (SanDiego,Irvine)g được xác định trên (Paris,London) thì bạn có thể nhận được hàm được xác định qua đầu vào kết hợp (SanDiego,Irvine)(Paris,London) bằng cách thực hiện f orElse g.

Nhưng trong trường hợp của bạn có vẻ như, sự việc xảy ra cho một cho vị trí (l1,l2) tuple và sau đó bạn làm một số công việc ...

Nếu bạn thấy mình viết rất nhiều {case (L,M) => ... case (P,Q) => ...} sau đó nó có thể là dấu hiệu cho thấy chức năng từng phần phù hợp hơn.

Nếu không lựa chọn làm việc tốt với phần còn lại của bộ sưu tập và có thể được sử dụng như thế này thay vì bạn (a) Theo đề nghị:

val processedPaths = for { 
    f <- finders 
    p <- f(l1, l2) 
} yield process(p) 

Trong cho sự hiểu biết p được nâng lên thành một Traversable, vì vậy bạn don' thậm chí phải gọi số filter, isDefined hoặc get để bỏ qua công cụ tìm mà không có kết quả.

3

Nó không phải là tất cả những gì nổi tiếng, nhưng kể từ 2.8 Scala có một phương pháp collect được xác định trên bộ sưu tập của nó. collect tương tự như filter, nhưng có chức năng một phần và có ngữ nghĩa bạn mô tả.

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