Что такого сильного в плоской карте, что она заслуживает такого места в фольклоре Скала?
for
выражения в справочнике по языку. Это может дать некоторые подсказки.
Что такого сильного в плоской карте, что она заслуживает такого места в фольклоре Скала?
for
выражения в справочнике по языку. Это может дать некоторые подсказки.
Ответы:
Обоснование этой фразы состоит в том, что вы можете заменить много утомительного кода if / then / else, который вы бы написали, вызовами flatMap (и других функций более высокого порядка).
Это особенно верно для параметров (см. Http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/ )
Но это относится и к другим монадам (хотя я должен признать, что сам пока не совсем разбираюсь в деталях)
Представьте себе ситуацию, когда у вас есть коллекция, для которой вы хотите применить функцию (или серию функций), где каждая функция может возвращать null. Когда вы действительно используете null, ваш код будет пронизан нулевыми проверками. Но если вы используете параметры вместо значений, вы можете просто сопоставить значения с желаемыми функциями, связать функции в случае нескольких функций и получить коллекцию только с результатами, которые не являются нулевыми, что во многих случаях именно то, что вы хотите.
Поскольку это описание довольно запутанное, короткий совет «просто плоская карта, это дерьмо» утвердился.
Я слышал историю о том, что два выдающихся программиста Scala объединились, когда один из них начал писать такой код:
option match {
case Some ...
В этот момент другой сказал: «Что это? Любительский час? Плоская карта, это дерьмо!»
Что касается того, что в этом такого мощного 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 - лучшее место для начала, чтобы увидеть, как вы будете многократно отображать плоскую карту серии поисков (например) в окончательный результат.