Thành ngữ "flatmap that s ***" trong Scala bắt nguồn từ đâu?


104

Bản đồ phẳng có gì mạnh mẽ đến mức nó xứng đáng có một vị trí như vậy trong văn hóa dân gian Scala?


30
[cần dẫn nguồn]
tstenner 19/12/11

1
Đọc phần về cách trình biên dịch xử lý các forbiểu thức trong tham chiếu ngôn ngữ. Nó có thể đưa ra một số gợi ý.
Dirk

@tstenner: Miễn là chúng ta đang dựa vào meme ngắn gọn: Google là bạn của bạn.
Chuck

4
@aishwarya Nó giống như "sử dụng flatMap Chỉ cần vào danh sách của bạn / mảng / tùy chọn", không phải "shit" như trong "xấu"
tstenner

1
Trên thực tế, cụm từ cụ thể đó (tất nhiên) đã được đưa ra khỏi ngữ cảnh, nơi ai đó đã bỏ lỡ đơn nguyên Bar (Reader) ở đâu đó ở Manhattan ;-) Vì nó xảy ra trong những trường hợp như vậy, phiên bản ngắn bị kẹt.
Roland Kuhn

Câu trả lời:


55

Lý do đằng sau cụm từ này là bạn có thể thay thế rất nhiều mã if / then / else tẻ nhạt mà bạn sẽ viết bằng các lệnh gọi đến flatMap (và các hàm bậc cao khác).

Điều này đặc biệt đúng với Tùy chọn (xem http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/ )

Nhưng nó cũng áp dụng cho các monads khác (mặc dù tôi phải thừa nhận, bản thân tôi cũng không hiểu chính xác chi tiết)

Hãy tưởng tượng tình huống bạn có một bộ sưu tập mà bạn muốn áp dụng một hàm (hoặc một loạt các hàm) trong đó mỗi hàm có thể trả về null. Khi bạn thực sự sử dụng null, mã của bạn sẽ bị đánh đố với các kiểm tra null. Nhưng nếu bạn sử dụng Tùy chọn thay vì các giá trị, bạn chỉ có thể lập bản đồ phẳng các giá trị với các hàm mong muốn, xâu chuỗi các hàm trong trường hợp nhiều hàm và nhận được một bộ sưu tập chỉ với các kết quả không rỗng, trong nhiều trường hợp, đó chính xác là những gì bạn muốn.

Vì mô tả đó khá phức tạp, nên lời khuyên ngắn gọn hơn "chỉ cần sơ đồ phẳng mà shit" đã tự thiết lập.


Cá nhân tôi đôi khi sử dụng đơn nguyên danh sách để đối phó với các kết hợp.
Dan Burton

103

Câu chuyện tôi đã nghe là hai lập trình viên Scala ưu việt đã ghép đôi khi một trong số họ bắt đầu viết một số mã như thế này:

option match {
    case Some ...

Tại thời điểm đó, người khác nói "Đây là gì? Giờ nghiệp dư? Bản đồ phẳng mà shit!"

Về điều gì có sức mạnh như vậy flatMap, thì ... Đầu tiên, đó là toán tử đơn nguyên cơ bản. Điều đó có nghĩa là nó là một hoạt động phổ biến được chia sẻ, ví dụ, các vùng chứa (chẳng hạn như Option, tập hợp, v.v.), sự liên tục, trạng thái, v.v. Thứ hai, trong khi bạn có thể hủy cấu trúc một Option, điều đó, ngược lại flatMap, không phải là một hoạt động đơn nguyên , vì vậy nó không thể được áp dụng rộng rãi. Ngoài ra, nó đòi hỏi quá nhiều kiến ​​thức về dữ liệu bạn đang thao tác.

Lưu ý: trước đây tôi đã nói khớp chậm hơn flatMap- thực tế là ngược lại, cho đến phiên bản mới nhất của Scala tại thời điểm viết bài này, 2.10.1.)


4
Tôi đoán tôi vẫn đang ở giờ nghiệp dư sau đó :-)
Guillaume Belrose

69
Hai lập trình viên đó là tôi và Paul Chiusano.
Apocalisp

1
Nếu tôi nhớ không lầm, chẳng phải #legendofklang cũng xuất hiện trên twitter cùng lúc ... mà thường là gốc rễ của việc bỏ sót bản đồ phẳng khiến meme? Chúng ta nên thực hiện một số loại mục nhập Scala meme wiki; có một số cái tuyệt vời bây giờ!
timothy 19/12/11

3
@WillSargent Tôi nghĩ rằng đó là rừng cho cây cối. Lợi thế là nó sáng tác . Nếu tôi có một hàm phụ thuộc vào bốn đơn nguyên, tôi có thể viết val res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d). Tôi có thể thêm nhiều monads hơn, xóa monads và nó vẫn giữ nguyên. Ngoài ra, lưu ý rằng nó không phân hủy thành String, mà thành Option[String]. Tuy nhiên, trên thực tế, nó không hề bị phân hủy. Một trong những lý do khiến một số người không thích sử dụng vùng chứa làm ví dụ cho monads là bạn có thể lấy mọi thứ ra khỏi vùng chứa, nhưng không phải tất cả các monads đều cho phép bạn làm điều đó.
Daniel C. Sobral

1
Bạn có thể thấy một liên kết đến các cuộc thảo luận được trích dẫn ở đây: web.archive.org/web/20130627111326/http://beust.com/weblog/2010/...
Hawkeye

12

Điều quan trọng flatMaplà Scala đại diện cho hoạt động ràng buộc đơn nguyên. Có rất nhiều hướng dẫn trên web giải thích mục đích của monads và tại sao chính xác thì chúng lại hữu ích như vậy; James Iry có một cái đi vào một số chi tiết.


4
Tôi nghĩ rằng đây là câu trả lời chính xác, Optionchỉ là một trong nhiều flatMaptrường hợp sử dụng. Tất nhiên, nếu bạn muốn quan sát monads trong "môi trường sống tự nhiên" của chúng, bạn nên kiểm tra Haskell. Sự khác biệt duy nhất là Haskellers nói: "Just >> = that shit!"
Landei

Cảm ơn liên kết đến bài viết, tôi thấy nó rất hữu ích. Tôi cũng đã quay lại chương "Đối với các biểu thức được xem lại" trong Lập trình trong Scala, làm sáng tỏ một số vòng lặp và việc sử dụng chúng của bộ lọc, bản đồ, bản đồ phẳng và làm phẳng.
Guillaume Belrose

10

Runar Bjarnason là người bạn đang tìm kiếm nguồn gốc.

Thành thật mà nói, nhận ra tại sao nó lại mạnh mẽ đến vậy là điều mà chỉ có thể đến với thời gian. Lớp Option là nơi tốt nhất để bắt đầu để xem bạn sẽ liên tục lập bản đồ phẳng một loạt các tra cứu (ví dụ) thành kết quả cuối cùng như thế nào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.