Звідки походить ідіоматичний вираз «плоскої карти, що є ***» у Скалі?


104

Що настільки потужного в плоскому вигляді, що воно заслуговує на таке місце у фольклорі Скали?


30
[цитування потрібно]
tstenner

1
Прочитайте розділ про те, як компілятор обробляє forвирази в мовній мові. Це може дати деякі підказки.
Дірк

@tstenner: Поки ми схиляємось до стислих мемів: Google - ваш друг.
Чак

4
@aishwarya Це більше схоже на "Просто використовуйте рівну карту у своєму списку / масиві / опції", а не "лайно", як у "поганому"
tstenner

1
Власне, ця конкретна фраза була (звичайно) виведена з контексту, коли хтось пропустив монаду Bar (Reader) десь на Манхеттені ;-) Як це буває в таких випадках, коротка версія застрягла.
Роланд Кун

Відповіді:


55

Аргументація цієї фрази полягає в тому, що ви можете замінити багато нудних кодів if / then / else, які ви писали б дзвінками на flatMap (та інші функції вищого порядку).

Особливо це стосується параметрів (див. Http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/ )

Але це стосується і інших монардів (хоча, маю визнати, я ще точно не розумію деталей)

Уявіть ситуацію, коли у вас є колекція, до якої ви хочете застосувати функцію (або ряд функцій), де кожна функція може повернути нуль. Якщо ви фактично використовуєте null, код буде прошитий нульовими чеками. Але якщо ви використовуєте «Параметри» замість значень, ви можете просто зрівняти значення за допомогою потрібних функцій, зв’язавши функції у випадку декількох функцій і отримати колекцію лише з результатами, які не є нульовими, що в багатьох випадках саме те, що ти хочеш.

Оскільки цей опис є доволі звинуваченим, укорочена порада "просто плоска карта, що лайно".


Я особисто використовую монаду списку іноді, щоб мати справу з комбінаціями.
Ден Бертон

103

Я чув, що я почув, що двоє видатних програмістів Scala вступали в пару, коли один з них почав писати такий код:

option match {
    case Some ...

У цей момент інший сказав: "Що це? Годинник любителів? Плоска карта, що лайно!"

Щодо того, що таке потужне flatMap, ну ... По-перше, це основний монадичний оператор. Це означає, що це звичайна операція, поділяється, наприклад, контейнерами (наприклад Option, колекціями тощо), продовженнями, станом і т. Д. По-друге, тоді як ви можете деконструювати an Option, що, на відміну від flatMap, не є монадичною операцією , тому не може бути настільки широко застосованим. Крім того, для цього потрібно занадто багато знань про дані, якими ви маніпулюєте.

Примітка: раніше я говорив, що відповідність flatMapпроходить повільніше, ніж - навпаки, насправді, до останньої версії Scala на момент написання цього тексту, 2.10.1.)


4
Я здогадуюсь, що тоді я ще в любительській годині :-)
Гійом Белроуз

69
Ці два програмісти були я та Пол Чюсано.
Апокаліпс

1
Якщо я пригадую правильно, чи не #legendofklang виявлявся на твіттері приблизно в той самий час ... що часто є коренем пропуску атрибуції плоскої карти, що лайно мему? Ми мусимо зробити якусь запис вікі-мему Scala; Є кілька дивовижних зараз!
Тимофій

3
@WillSargent Я думаю, що лісу для дерев не вистачає. Перевага в тому, що вона складається . Якщо у мене є функція, яка залежить від чотирьох монад, я можу писати val res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d). Я можу додати більше монад, видалити монади, і він залишається таким же. Також зауважте, що він не розкладається на String, а на Option[String]. Хоча насправді вона зовсім не розкладається. Однією з причин, чому деякі люди не люблять використовувати контейнери як приклади для монад, - це те, що ви можете вийняти речі з контейнерів, але не всі монади дозволяють вам це робити.
Даніель К. Собрал

1
Ви можете ознайомитись із посиланням на дискусію, цитованою тут: web.archive.org/web/20130627111326/http://beust.com/weblog/2010/…
hawkeye

12

Важливим у тому flatMap, що Скала представляє монадійну операцію зв’язування. В Інтернеті є численні навчальні посібники, що пояснюють призначення монад і чому саме вони такі корисні; У Джеймса Ірі є одна деталь, яка детально описується.


4
Я думаю, що це правильна відповідь, Optionце лише один із багатьох flatMapвипадків використання. Звичайно, якщо ви хочете поспостерігати за монадами в їх "природному середовищі існування", вам слід перевірити Haskell. Єдина відмінність полягає в тому, що Haskellers кажуть: "Просто >> = це лайно!"
Ландей

Дякую за посилання на статтю, я вважаю це дуже корисним. Я також повернувся до розділу "Для виразів, що переглядаються" у програмі програмування у Scala, який прояснює світло для циклів та їх використання фільтру, карти, flatMap та згладжування.
Гійом Белроуз

10

Runar Bjarnason - це людина, яку ви шукаєте за походженням.

Усвідомлення того, чому він такий потужний, - це те, що може прийти лише з часом, якщо бути чесним. Клас "Опції" - найкраще місце для початку, щоб побачити, як ви неодноразово перетворюватимете серію підходів (наприклад) у кінцевий результат.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.