¿Qué tiene de poderoso el mapa plano para que merezca un lugar así en el folclore de Scala?
for
expresiones en la referencia del lenguaje. Podría dar algunas pistas.
¿Qué tiene de poderoso el mapa plano para que merezca un lugar así en el folclore de Scala?
for
expresiones en la referencia del lenguaje. Podría dar algunas pistas.
Respuestas:
El razonamiento detrás de esta frase es que puede reemplazar una gran cantidad de código tedioso if / then / else que escribiría con llamadas a flatMap (y otras funciones de orden superior).
Esto es especialmente cierto para las opciones (consulte http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/ )
Pero también se aplica a otras mónadas (aunque tengo que admitir que todavía no entiendo exactamente los detalles)
Imagine la situación en la que tiene una colección para la que desea aplicar una función (o una serie de funciones) donde cada función puede devolver nulo. Cuando realmente use null, su código estará plagado de verificaciones nulas. Pero si usa Opciones en lugar de valores, puede simplemente mapear los valores con las funciones deseadas, encadenar las funciones en el caso de múltiples funciones y obtener una colección con solo los resultados que no son nulos, que en muchos casos es exactamente lo que usted quiere.
Dado que esa descripción es bastante complicada, el consejo más corto "simplemente mapa plano de esa mierda" se estableció.
La historia que escuché fue que dos programadores destacados de Scala estaban emparejados cuando uno de ellos comenzó a escribir un código como este:
option match {
case Some ...
En ese momento el otro dijo "¿Qué es esto? ¿Hora amateur? ¡Mapa plano esa mierda!"
En cuanto a qué tiene de poderoso flatMap
, bueno ... Primero, es el operador monádico fundamental. Eso significa que es una operación común compartida por, por ejemplo, contenedores (como Option
, colecciones, etc.), continuaciones, estado, etc. En segundo lugar, si bien puede deconstruir una Option
, que, a diferencia de flatMap
, no es una operación monádica. , por lo que no se puede aplicar tan ampliamente. Además, requiere demasiado conocimiento sobre los datos que está manipulando.
Nota: anteriormente dije que la coincidencia era más lenta que flatMap
, de hecho, lo contrario es cierto, hasta la versión más reciente de Scala en el momento de escribir este artículo, 2.10.1.)
val res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d)
. Puedo agregar más mónadas, eliminar mónadas y permanece igual. Además, tenga en cuenta que no se descompone en String
, sino en Option[String]
. Aunque, en realidad, no se descompone en absoluto. Una de las razones por las que a algunas personas no les gusta usar contenedores como ejemplos de mónadas es que puedes sacar cosas de los contenedores, pero no todas las mónadas te permiten hacer eso.
Lo crucial flatMap
es que es la representación de Scala de la operación de enlace monádico. Hay numerosos tutoriales en la web que explican el propósito de las mónadas y por qué son tan útiles; James Iry tiene uno que entra en detalles.
Option
es solo uno de los muchos flatMap
casos de uso. Por supuesto, si desea observar mónadas en su "hábitat natural", debe visitar Haskell. La única diferencia es que los Haskellers dicen: "¡Sólo >> = esa mierda!"
Runar Bjarnason es la persona que busca para el origen.
Darse cuenta de por qué es tan poderoso es algo que solo puede llegar con el tiempo para ser sincero. La clase Option es el mejor lugar para comenzar para ver cómo planificaría repetidamente una serie de búsquedas (por ejemplo) en un resultado final.