Що настільки потужного в плоскому вигляді, що воно заслуговує на таке місце у фольклорі Скали?
for
вирази в мовній мові. Це може дати деякі підказки.
Що настільки потужного в плоскому вигляді, що воно заслуговує на таке місце у фольклорі Скали?
for
вирази в мовній мові. Це може дати деякі підказки.
Відповіді:
Аргументація цієї фрази полягає в тому, що ви можете замінити багато нудних кодів if / then / else, які ви писали б дзвінками на flatMap (та інші функції вищого порядку).
Особливо це стосується параметрів (див. Http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/ )
Але це стосується і інших монардів (хоча, маю визнати, я ще точно не розумію деталей)
Уявіть ситуацію, коли у вас є колекція, до якої ви хочете застосувати функцію (або ряд функцій), де кожна функція може повернути нуль. Якщо ви фактично використовуєте null, код буде прошитий нульовими чеками. Але якщо ви використовуєте «Параметри» замість значень, ви можете просто зрівняти значення за допомогою потрібних функцій, зв’язавши функції у випадку декількох функцій і отримати колекцію лише з результатами, які не є нульовими, що в багатьох випадках саме те, що ти хочеш.
Оскільки цей опис є доволі звинуваченим, укорочена порада "просто плоска карта, що лайно".
Я чув, що я почув, що двоє видатних програмістів Scala вступали в пару, коли один з них почав писати такий код:
option match {
case Some ...
У цей момент інший сказав: "Що це? Годинник любителів? Плоска карта, що лайно!"
Щодо того, що таке потужне flatMap
, ну ... По-перше, це основний монадичний оператор. Це означає, що це звичайна операція, поділяється, наприклад, контейнерами (наприклад Option
, колекціями тощо), продовженнями, станом і т. Д. По-друге, тоді як ви можете деконструювати an Option
, що, на відміну від flatMap
, не є монадичною операцією , тому не може бути настільки широко застосованим. Крім того, для цього потрібно занадто багато знань про дані, якими ви маніпулюєте.
Примітка: раніше я говорив, що відповідність flatMap
проходить повільніше, ніж - навпаки, насправді, до останньої версії Scala на момент написання цього тексту, 2.10.1.)
val res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d)
. Я можу додати більше монад, видалити монади, і він залишається таким же. Також зауважте, що він не розкладається на String
, а на Option[String]
. Хоча насправді вона зовсім не розкладається. Однією з причин, чому деякі люди не люблять використовувати контейнери як приклади для монад, - це те, що ви можете вийняти речі з контейнерів, але не всі монади дозволяють вам це робити.
Важливим у тому flatMap
, що Скала представляє монадійну операцію зв’язування. В Інтернеті є численні навчальні посібники, що пояснюють призначення монад і чому саме вони такі корисні; У Джеймса Ірі є одна деталь, яка детально описується.
Option
це лише один із багатьох flatMap
випадків використання. Звичайно, якщо ви хочете поспостерігати за монадами в їх "природному середовищі існування", вам слід перевірити Haskell. Єдина відмінність полягає в тому, що Haskellers кажуть: "Просто >> = це лайно!"
Runar Bjarnason - це людина, яку ви шукаєте за походженням.
Усвідомлення того, чому він такий потужний, - це те, що може прийти лише з часом, якщо бути чесним. Клас "Опції" - найкраще місце для початку, щоб побачити, як ви неодноразово перетворюватимете серію підходів (наприклад) у кінцевий результат.