2013-02-26 28 views
7

Có ai có một ví dụ làm việc đầy đủ về một đơn nguyên Scala giải quyết một vấn đề thực tế và so sánh với cùng một mã được viết bằng Java không?Scala Monad - Ví dụ làm việc đầy đủ

+0

Mặc dù không phải là một ví dụ điển hình, đây là một nghiên cứu khá sâu sắc về Có lẽ đơn nguyên trong Java (với một số Haskell không để xem các ngôn ngữ có khả năng hơn có thể giải quyết vấn đề này như thế nào): http://logicaltypes.blogspot.com/2011/09/monads-in-java.html –

+5

Có ai không? –

+3

Khái niệm về Monad không phải là lạ như nó có vẻ (hoặc tên của nó làm cho nó có vẻ). Đối với tốt hơn hoặc tồi tệ hơn, thuật ngữ này từ Lý thuyết danh mục là vô cùng thiết thực, nhưng nhà tiên phong của lập trình ngày nay là mạnh mẽ de-nhấn mạnh (thậm chí derogate) lý thuyết. Để tâm trí của tôi, đây là một disgrace và disqualifies phần mềm từ lĩnh vực "kỹ thuật" –

Trả lời

11

Tất cả các bộ sưu tập đều là đơn nguyên (đó là một tuyên bố chung, không phải là một quy tắc cụ thể của Scala) hoặc "có các đơn vị" tùy thuộc vào mức độ nghiêm ngặt của bạn. Scala cũng có Option như một đơn nguyên, và các dự báo bên phải và trái của Either. Bạn có thể thấy các khía cạnh monadic của họ tại nơi làm việc bất cứ khi nào bạn thấy một sự hiểu biết với họ.

Ví dụ tinh tế hơn về monads trong Scala là trình kết hợp phân tích cú pháp. Nó tinh tế hơn bởi vì các toán tử ẩn các hoạt động đơn lẻ đằng sau các từ đồng nghĩa trông đẹp hơn trong ngữ pháp.

9
def optionAdd(x:Option[Int], y:Option[Int]):Option[Int] = 
    for(xx <- x; yy <- y) yield xx+yy 

Tôi không dám lãng phí thời gian với phiên bản java, đặc biệt vì có người thông minh hơn rất nhiều hơn tôi đã làm http://functionaljava.org/examples/1.5/#Option.bind. Ví dụ trong liên kết đang làm về cơ bản những gì optionAdd thực hiện theo một cách ngắn gọn vô cùng ngắn gọn.

2

thấy http://jazzy.id.au/default/2012/11/02/scaling_scala_vs_java.html

Ví dụ async cuộc gọi sử dụng monads tới bốn khách hàng:

for { 
    user <- getUserById(id) 
    orders <- getOrdersForUser(user.email) 
    products <- getProductsForOrders(orders) 
    stock <- getStockForProducts(products) 
} yield stock 

Futues là monadic và cho comprehensions thể được sử dụng để soạn mã không đồng bộ

Trong java cũng ... bắt đầu chờ đợi Monads with Java 8

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