Lea la sección sobre cómo el compilador maneja las forexpresiones en la referencia del lenguaje. Podría dar algunas pistas.
Dirk
@tstenner: Mientras nos apoyemos en memes escuetos: Google es tu amigo.
Chuck
4
@aishwarya Es más como "Solo usa mapa plano en tu lista / matriz / opción", no "mierda" como en "malo"
tstenner
1
En realidad, esa frase específica fue (por supuesto) sacada de contexto, donde alguien se perdió la mónada Bar (Reader) en algún lugar de Manhattan ;-) Como sucede en tales casos, la versión corta se quedó.
Roland Kuhn
Respuestas:
55
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).
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ó.
Yo personalmente uso la lista de mónadas a veces para tratar combinaciones.
Dan Burton
103
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{caseSome...
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.)
Supongo que todavía estoy en la hora amateur entonces :-)
Guillaume Belrose
69
Esos dos programadores éramos Paul Chiusano y yo.
Apocalipsis
1
Si mal no recuerdo, ¿no se estaba manifestando #legendofklang en Twitter al mismo tiempo ... que a menudo es la raíz de la atribución errónea del mapa plano que mierda meme? Deberíamos hacer algún tipo de entrada en la wiki de Scala meme; ¡hay algunos increíbles ahora!
timoteo
3
@WillSargent Creo que le falta el bosque a los árboles. La ventaja es que compone . Si tengo una función que depende de cuatro mónadas, puedo escribir 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 flatMapes 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.
Creo que esta es la respuesta correcta, Optiones solo uno de los muchos flatMapcasos 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!"
Landei
Gracias por el enlace al artículo, lo encontré muy útil. También volví al capítulo "Revisiones para expresiones" en Programación en Scala, que arroja algo de luz sobre los bucles for y su uso de filter, map, flatMap y flatten.
Guillaume Belrose
10
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.
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ó.
fuente
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:
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 (comoOption
, colecciones, etc.), continuaciones, estado, etc. En segundo lugar, si bien puede deconstruir unaOption
, que, a diferencia deflatMap
, 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.)fuente
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 enString
, sino enOption[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.fuente
Option
es solo uno de los muchosflatMap
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.
fuente