2012-04-16 11 views
6

Tôi bắt đầu học ngôn ngữ lập trình Scala. Tôi đã một số nắm bắt ngôn ngữ FP như Erlang và Haskell và tôi có một nghi ngờ về ý nghĩa của các biểu thức/năng suất, như:Có phải 'lợi nhuận' trong Scala tương đương với chức năng bản đồ không?

for (arg <- args) yield arg.length 

này sẽ thu thập một mảng với độ dài của bất kỳ tham số đầu vào. Từ những gì tôi đã hiểu điều này có vẻ như chức năng bản đồ trong lập trình FP bình thường:

map (\a -> a * 2) [1, 2, 3] (in Haskell) 

Tôi biết rằng thư viện Scala chứa các phương pháp scala.collection.map, vì vậy tôi muốn biết: Là Có sự khác biệt hoặc giới hạn trong việc sử dụng một trong hai phong cách, hoặc họ là chính xác như nhau?

+1

thể trùng lặp của (http://stackoverflow.com/questions/1052476/can-someone-explain-scalas-yield) –

+2

Scala's for comprehension tương tự như ký hiệu 'do' của Haskell. –

+1

#Daniel, nhưng tôi không yêu cầu ý nghĩa 'năng suất', nhưng đối với những điểm tương đồng với các biểu thức FP khác! –

Trả lời

14

for ... yield hiểu trong Scala được dịch bởi trình biên dịch sang các cuộc gọi phương thức map, flatMapwithFilter. for mà không cần yield sẽ được dịch sang cuộc gọi phương thức foreach. Bạn có thể tìm thấy một số ví dụ và biết thêm thông tin ở đây: [? Ai đó có thể giải thích năng suất của Scala]

http://tataryn.net/2011/10/whats-in-a-scala-for-comprehension/

và đây

http://adamwojtuniak.wordpress.com/2010/09/24/scala-for-comprehensions/

+4

Và như vậy, flatMap và withFilter tương đương với concat và chọn ... Chúng thực sự nên xác định một hệ thống đặt tên tiêu chuẩn cho các mẫu chức năng này;) –

6

Biểu thức Scala's for/yield hoàn toàn tương đương với danh sách/tính đơn lẻ trong Haskell và có chính xác các khả năng giống nhau, miễn là bạn chỉ cần nhập một loại cho mỗi biểu thức for. (Tuy nhiên, tôi không biết về Erlang.)

Cụ thể, ví dụ của bạn chính xác chuyển thành [length arg | arg <- args], dịch gọi phương thức Scala x.f thành ứng dụng chức năng Haskell f x.

+1

Liệu 'yield' có tạo ra kết quả tăng dần hay toàn bộ danh sách trong một lần không? –

+1

Ví dụ tốt Ptharien, Haskell luôn đi trước thời đại! Về sản lượng gia tăng năng suất, tôi nghĩ rằng nó quan trọng khi bạn muốn song song mã, cho những gì tôi nhớ Scala có bộ sưu tập song song và phương pháp .par cho rằng trong 2.9. –

3

Năng suất được biên dịch xuống bản đồ - nó nằm trong sách Lập trình trong Scala.