2012-10-04 15 views
6

Về cơ bản tôi muốn trích xuất một loạt các tùy chọn a, b, v.v. Đây có phải là cách tốt nhất để làm điều này trong Scala? Nó có vẻ khó hiểu với tôi để có năng suất trong ngoặc đơn.Là Scala mô hình cho năng suất-getOrElse hay có cách nào tốt hơn?

(for { 
    a <- a 
    b <- b 
    c <- c 
    ... 
} yield { 
    ... 
}) getOrElse { 
    ... 
} 
+2

Có vẻ như bạn sẽ không nhận được tốt hơn điều này với scala * lõi *, nhưng có thể bạn có thể [thử cho scalaz] (http://www.casualmiracles.com/2012/01/16/a-small -example-of-applicative-functors-with-scalaz /)? –

+0

Ví dụ về scalaz không thực sự đối phó với kịch bản này mà thay vào đó là 3 tùy chọn độc lập; ở đây câu hỏi là về các tùy chọn lồng nhau; tui bỏ lỡ điều gì vậy? –

+0

Tôi không nghĩ có bất kỳ điều gì sai trái với một sự hiểu biết được bao bọc trong các lần parens, nó là một biểu hiện giống như bất kỳ thứ gì khác. Tôi làm nó suốt. –

Trả lời

6

Hãy thử sử dụng mapflatMap để thay thế. Giả sử bạn có hệ thống phân cấp lớp sau đây:

case class C(x: Int) 
case class B(c: Option[C]) 
case class A(b: Option[B]) 

val a = Some(A(Some(B(Some(C(42)))))) 

Để trích xuất 42 bạn có thể nói:

a.flatMap(_.b).flatMap(_.c).map(_.x).getOrElse(-1) 

Đây là tương đương với:

for(
    a <- a 
    b <- a.b 
    c <- b.c) 
     yield c.x 

ngoại trừ việc nó trả Some(42). Trong thực tế, tính năng đọc for thực sự được dịch thành một chuỗi các cuộc gọi map/flatMap.

+0

do đó sẽ có một chuỗi các sơ đồ phẳng/bản đồ? (Garret đã viết '...' vì vậy tôi đoán sẽ có nhiều hơn hai lựa chọn) –

+0

Còn về c, d, v.v ...? Và đó là mô hình, nếu có một điều như vậy trong Scala? –

+0

@ om-nom-nom: Tôi đã đổi mới ví dụ của mình để chỉ rõ cách chuỗi được triển khai. –

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