Откуда в Scala идиоматическое выражение «плоская карта, которая дерьмо»?

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. Когда вы действительно используете null, ваш код будет пронизан нулевыми проверками. Но если вы используете параметры вместо значений, вы можете просто сопоставить значения с желаемыми функциями, связать функции в случае нескольких функций и получить коллекцию только с результатами, которые не являются нулевыми, что во многих случаях именно то, что вы хотите.

Поскольку это описание довольно запутанное, короткий совет «просто плоская карта, это дерьмо» утвердился.

Йенс Шаудер
источник
Я лично иногда использую монаду списка для работы с комбинациями.
Дэн Бертон
103

Я слышал историю о том, что два выдающихся программиста Scala объединились, когда один из них начал писать такой код:

option match {
    case Some ...

В этот момент другой сказал: «Что это? Любительский час? Плоская карта, это дерьмо!»

Что касается того, что в этом такого мощного flatMap... Во-первых, это фундаментальный монадический оператор. Это означает, что это обычная операция, совместно используемая, например, в контейнерах (например Option, коллекциях и т. Д.), Продолжениях, состоянии и т. Д. Во-вторых, хотя вы можете деконструировать объект Option, который, в отличие от flatMap, не является монадической операцией , поэтому он не может применяться так широко. Кроме того, для этого требуется слишком много знаний о данных, которыми вы управляете.

Примечание: ранее я говорил, что сопоставление было медленнее, чем flatMap- на самом деле верно противоположное, вплоть до самой последней версии Scala на момент написания этой статьи, 2.10.1.)

Дэниел С. Собрал
источник
4
Думаю, я все еще нахожусь в любительском часе :-)
Гийом Белроуз
69
Этими двумя программистами были я и Пол Кьюзано.
Apocalisp
1
Если я правильно помню, разве #legendofklang не проявил себя в твиттере примерно в то же время ... что часто является причиной неправильной атрибуции плоской карты этого дерьмового мема? Мы должны сделать что-то вроде вики-статьи о Scala meme; теперь есть несколько классных!
Тимоти
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является то, что это представление Scala для операции монадического связывания. В сети есть множество руководств, объясняющих назначение монад и почему они так полезны; У Джеймса Айри есть одно, в котором подробно описаны некоторые детали.

Субмоноид
источник
4
Думаю, это правильный ответ, Optionэто лишь один из многих вариантов flatMapиспользования. Конечно, если вы хотите наблюдать монады в их «естественной среде обитания», вам стоит попробовать Haskell. Единственная разница в том, что Хаскеллеры говорят: «Просто >> = это дерьмо!»
Landei
Спасибо за ссылку на статью, она мне очень пригодилась. Я также вернулся к главе «Возвращение к выражениям» в «Программировании на Scala», которая проливает свет на циклы for и их использование filter, map, flatMap и flatten.
Гийом Белроз
10

Рунар Бьярнасон - это человек, которого вы ищите по происхождению.

Честно говоря, осознание того, почему это так мощно, может прийти только со временем. Класс Option - лучшее место для начала, чтобы увидеть, как вы будете многократно отображать плоскую карту серии поисков (например) в окончательный результат.

Шон Парсонс
источник