2011-09-20 22 views
6

Biểu thức tính toán F # cho phép ẩn sự phức tạp của cú pháp đơn thuần sau một lớp đường cú pháp dày. Có cái gì đó tương tự có sẵn trong Scala?Tương đương với Haskell do-notation hoặc F # Computation Expressions trong Scala?

Tôi nghĩ rằng đó là cho comprehensions ...

Ví dụ:

val f = for { 
    a <- Future(10/2) // 10/2 = 5 
    b <- Future(a + 1) // 5 + 1 = 6 
    c <- Future(a - 1) // 5 - 1 = 4 
} yield b * c   // 6 * 4 = 24 

val result = f.get 

Nhưng nó không thực sự cảm thấy đúng. Có cú pháp tốt hơn không?

cho dụ trong Haskell bạn sẽ phải

 
    main = do fromHandle <- getAndOpenFile "Copy from: " ReadMode 
      toHandle <- getAndOpenFile "Copy to: " WriteMode 
      contents <- hGetContents fromHandle 
      hPutStr toHandle contents 
      hClose toHandle 
      putStr "Done." 

này không giống như scala không giống như một vòng lặp foreach. Cú pháp Scala dường như có liên kết quá mạnh với Danh sách hiểu là một khái niệm khác biệt. Mà ngăn tôi viết nội bộ DSL (monad) mà không nhìn lạ.

+4

'for' comprehensions là chính xác. Họ desugar để 'map' và' flatMap' đằng sau hậu trường, đó là chính xác như thế nào Haskell 'do' ký hiệu hoạt động (ngoại trừ những phương pháp được gọi là' fmap' và '>> =' trong Haskell). –

+0

@pelotom Tôi rất muốn xem câu trả lời giải thích thêm một chút về điều đó. –

+5

@Dan Burton - Câu hỏi này đã được hỏi và trả lời nhiều lần ... Tôi sẽ giới thiệu cho bạn câu trả lời tuyệt vời này: http://stackoverflow.com/questions/1052476/can-someone-explain-scalas-yield/1059501 # 1059501 –

Trả lời

-2

Dường như không có cú pháp như vậy có sẵn trong scala và chúng tôi sẽ cần phải thực hiện nó ourself bằng cách sử dụng kiến ​​trúc plugin trình biên dịch.

+0

Tôi đã nghĩ đến việc sử dụng các macro - bạn đã xem xét điều đó chưa? –

4

Các mảnh còn thiếu có lẽ là việc sử dụng các = là của scala cho-comprehensions:

val f = for { 
    a <- Future(10/2) // 10/2 = 5 
    b <- Future(a + 1) // 5 + 1 = 6 
    c <- Future(a - 1) // 5 - 1 = 4 
    d = b * c   // 6 * 4 = 24 
} yield d 


val result = f.get 

Với trộn đúng đắn của cả hai <-=, bạn nên có tất cả sự linh hoạt mà bạn cần.

+1

Đôi khi tôi muốn cú pháp 'do' của Haskell sẽ suy ra' let' từ việc sử dụng '=' –

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