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?
for
biểu thức trong tham chiếu ngôn ngữ. Nó có thể đưa ra một số gợi ý.
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?
for
biểu thức trong tham chiếu ngôn ngữ. Nó có thể đưa ra một số gợi ý.
Câu trả lời:
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â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.)
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 đó.
Điều quan trọng flatMap
là 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.
Option
chỉ là một trong nhiều flatMap
trườ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!"
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.