Прочтите раздел о том, как компилятор обрабатывает forвыражения в справочнике по языку. Это может дать некоторые подсказки.
Дирк
@tstenner: Пока мы опираемся на короткие мемы: Google - ваш друг.
Чак
4
@aishwarya Это больше похоже на «Просто используйте плоскую карту в вашем списке / массиве / параметре», а не «дерьмо», как в «плохом»
tstenner
1
На самом деле, эта конкретная фраза была (конечно) вырвана из контекста, когда кто-то пропустил монаду Bar (Reader) где-то на Манхэттене ;-) Как это бывает в таких случаях, короткая версия застряла.
Роланд Кун
Ответы:
55
Обоснование этой фразы состоит в том, что вы можете заменить много утомительного кода if / then / else, который вы бы написали, вызовами flatMap (и других функций более высокого порядка).
Но это относится и к другим монадам (хотя я должен признать, что сам пока не совсем разбираюсь в деталях)
Представьте себе ситуацию, когда у вас есть коллекция, для которой вы хотите применить функцию (или серию функций), где каждая функция может возвращать null. Когда вы действительно используете null, ваш код будет пронизан нулевыми проверками. Но если вы используете параметры вместо значений, вы можете просто сопоставить значения с желаемыми функциями, связать функции в случае нескольких функций и получить коллекцию только с результатами, которые не являются нулевыми, что во многих случаях именно то, что вы хотите.
Поскольку это описание довольно запутанное, короткий совет «просто плоская карта, это дерьмо» утвердился.
Я лично иногда использую монаду списка для работы с комбинациями.
Дэн Бертон
103
Я слышал историю о том, что два выдающихся программиста Scala объединились, когда один из них начал писать такой код:
option match{caseSome...
В этот момент другой сказал: «Что это? Любительский час? Плоская карта, это дерьмо!»
Что касается того, что в этом такого мощного flatMap... Во-первых, это фундаментальный монадический оператор. Это означает, что это обычная операция, совместно используемая, например, в контейнерах (например Option, коллекциях и т. Д.), Продолжениях, состоянии и т. Д. Во-вторых, хотя вы можете деконструировать объект Option, который, в отличие от flatMap, не является монадической операцией , поэтому он не может применяться так широко. Кроме того, для этого требуется слишком много знаний о данных, которыми вы управляете.
Примечание: ранее я говорил, что сопоставление было медленнее, чем flatMap- на самом деле верно противоположное, вплоть до самой последней версии Scala на момент написания этой статьи, 2.10.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]. Хотя на самом деле он совсем не разлагается. Одна из причин, по которой некоторые люди не любят использовать контейнеры в качестве примеров для монад, заключается в том, что вы можете извлекать вещи из контейнеров, но не все монады позволяют вам это делать.
Ключевым моментом flatMapявляется то, что это представление Scala для операции монадического связывания. В сети есть множество руководств, объясняющих назначение монад и почему они так полезны; У Джеймса Айри есть одно, в котором подробно описаны некоторые детали.
Думаю, это правильный ответ, Optionэто лишь один из многих вариантов flatMapиспользования. Конечно, если вы хотите наблюдать монады в их «естественной среде обитания», вам стоит попробовать Haskell. Единственная разница в том, что Хаскеллеры говорят: «Просто >> = это дерьмо!»
Landei
Спасибо за ссылку на статью, она мне очень пригодилась. Я также вернулся к главе «Возвращение к выражениям» в «Программировании на Scala», которая проливает свет на циклы for и их использование filter, map, flatMap и flatten.
Гийом Белроз
10
Рунар Бьярнасон - это человек, которого вы ищите по происхождению.
Честно говоря, осознание того, почему это так мощно, может прийти только со временем. Класс Option - лучшее место для начала, чтобы увидеть, как вы будете многократно отображать плоскую карту серии поисков (например) в окончательный результат.
for
выражения в справочнике по языку. Это может дать некоторые подсказки.Ответы:
Обоснование этой фразы состоит в том, что вы можете заменить много утомительного кода if / then / else, который вы бы написали, вызовами flatMap (и других функций более высокого порядка).
Это особенно верно для параметров (см. Http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/ )
Но это относится и к другим монадам (хотя я должен признать, что сам пока не совсем разбираюсь в деталях)
Представьте себе ситуацию, когда у вас есть коллекция, для которой вы хотите применить функцию (или серию функций), где каждая функция может возвращать null. Когда вы действительно используете null, ваш код будет пронизан нулевыми проверками. Но если вы используете параметры вместо значений, вы можете просто сопоставить значения с желаемыми функциями, связать функции в случае нескольких функций и получить коллекцию только с результатами, которые не являются нулевыми, что во многих случаях именно то, что вы хотите.
Поскольку это описание довольно запутанное, короткий совет «просто плоская карта, это дерьмо» утвердился.
источник
Я слышал историю о том, что два выдающихся программиста Scala объединились, когда один из них начал писать такой код:
В этот момент другой сказал: «Что это? Любительский час? Плоская карта, это дерьмо!»
Что касается того, что в этом такого мощного
flatMap
... Во-первых, это фундаментальный монадический оператор. Это означает, что это обычная операция, совместно используемая, например, в контейнерах (напримерOption
, коллекциях и т. Д.), Продолжениях, состоянии и т. Д. Во-вторых, хотя вы можете деконструировать объект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
является то, что это представление Scala для операции монадического связывания. В сети есть множество руководств, объясняющих назначение монад и почему они так полезны; У Джеймса Айри есть одно, в котором подробно описаны некоторые детали.источник
Option
это лишь один из многих вариантовflatMap
использования. Конечно, если вы хотите наблюдать монады в их «естественной среде обитания», вам стоит попробовать Haskell. Единственная разница в том, что Хаскеллеры говорят: «Просто >> = это дерьмо!»Рунар Бьярнасон - это человек, которого вы ищите по происхождению.
Честно говоря, осознание того, почему это так мощно, может прийти только со временем. Класс Option - лучшее место для начала, чтобы увидеть, как вы будете многократно отображать плоскую карту серии поисков (например) в окончательный результат.
источник