scala - quiere - monadologia leibniz pdf
¿Cómo llamas a los datos envueltos dentro de una mónada? (6)
Al hablar y escribir, sigo queriendo referirme a los datos dentro de una mónada, pero no sé cómo llamarlo.
Por ejemplo, en Scala, el argumento de la función que se pasa a flatMap
se une a ... eh ... esa cosa dentro de la mónada. En:
List(1, 2, 3).flatMap(x => List(x, x))
x
se une a esa cosa para la que no tengo una palabra.
Para complicar un poco las cosas, el argumento pasado a la flecha de Kleisli no necesariamente se vincula a todos los datos dentro de la mónada. Con List
, Set
, Stream
y muchas otras mónadas, flatMap
llama a la flecha de Kleisli muchas veces, uniendo x
a una parte diferente de los datos dentro de la mónada cada vez. O tal vez ni siquiera a "datos", siempre que se sigan las leyes de la mónada. Sea lo que sea, está envuelto dentro de la mónada, y flatMap
pasa sin el envoltorio, tal vez una pieza a la vez. Solo quiero saber cómo llamar a las cosas relevantes dentro de la mónada a las que se refiere x
, al menos en parte, para poder detener todo este lenguaje tímidamente.
¿Hay un término estándar o convencional para esta cosa / data / value / stuff / lo que sea que sea?
Si no, ¿qué hay de "los dulces"?
¿Qué datos?
data Monady a = Monady
Los valores de las mónadas son valores de las mónadas, su tipo envuelto puede ser completamente una ficción. Lo que quiere decir que hablar de ello como si existiera puede causarle dolor.
De lo que se quiere hablar son las continuaciones como Monad m => a -> mb
ya que están garantizadas para existir. Las cosas graciosas ocurren en cómo (>>=)
usa esas continuaciones.
Da un paso atrás aquí.
Una mónada no es solo el functor m
que envuelve un valor a
. Una mónada es la pila de endofunctores (es decir, las composiciones de m
''s), junto con el operador de join
. Ahí es donde está la famosa broma: que una mónada es un monoide en la categoría de endofunctores, ¿cuál es el problema? -- viene de.
(La historia completa es que el quip significa que la composición de m
''s es otra m
, como lo atestigua)
Una cosa con el tipo (ma)
se suele llamar acción de mónada. Puedes llamar a a
resultado de la acción.
Tratar de decir " x
se une a" te está configurando para el fracaso. Déjame explicarte y guiarte hacia una mejor manera de expresarte al hablar de este tipo de cosas.
Supongamos que tenemos:
someList.flatMap(x => some_expression)
Si sabemos que someList tiene el tipo List[Int]
, entonces podemos decir con seguridad que dentro de some_expression, x
está vinculado a un valor de tipo Int
. Observe la advertencia, "dentro de some_expression". Esto se debe a que, dado que someList = List(1,2,3)
, x
tomará los valores de cada uno de ellos: 1
, 2
y 3
, a su vez.
Considere un ejemplo más generalizado:
someMonadicValue.flatMap(x => some_expression)
Si no sabemos nada acerca de un someMonadicValue
de someMonadicValue
, entonces no sabemos mucho acerca de cómo se va a invocar a some_expression
. Puede ejecutarse una vez, o tres veces (como en el ejemplo anterior), o perezosamente o de forma asíncrona, o puede programarse una vez que se haya completado algún Valor de erradicación (por ejemplo, futuros), o nunca se pueda usar (por ejemplo, lista vacía, Ninguno ). La interfaz de someExpression
no incluye el razonamiento sobre cuándo o cómo se someExpression
alguna someExpression
. Así que todo lo que puede decir acerca de lo que será x
se limita al contexto de some_expression
, cuando quiera y como some_expression
que se evalúe some_expression
.
Así que volvamos al ejemplo.
someMonadicValue.flatMap(x => some_expression)
Usted está tratando de decir " x
es el ??? de someMonadicValue
". ¿Y estás buscando la palabra que reemplaza con precisión ???. Bueno, estoy aquí para decirte que lo estás haciendo mal. Si quieres hablar de x
, entonces hazlo
- Dentro del contexto de
some_expression
. En este caso, use la frase en negrita que le di arriba: "dentro de some_expression,x
está vinculado a un valor de tipoFoo
". O, alternativamente, puedes hablar sobrex
... - Con conocimiento adicional sobre con qué mónada estás tratando.
En el caso # 2, por ejemplo, para someList.flatMap(x => some_expression)
, podría decir que " x
es cada elemento de someList
". Para someFuture.flatMap(x => some_expression)
, podría decir que " x
es el valor futuro exitoso de someFuture
, si es que alguna vez se completa y tiene éxito".
Ya ves, esa es la belleza de Monads. Ese ??? que está tratando de describir, es lo que la interfaz de Monad abstrae . ¿Ahora ves por qué es tan difícil dar? ¿un nombre? Es porque tiene un nombre diferente y un significado diferente para cada mónada en particular. Y ese es el punto de tener la abstracción de la Mónada: unificar estos conceptos diferentes bajo la misma interfaz computacional.
flatMap
no llama la flecha de Kleisli muchas veces. Y "esa cosa" no es "dentro" de la mónada.
flatMap
levanta una flecha de Kleisli a la mónada. Podría ver esto como la construcción de una flecha M[A] => M[B]
entre los tipos ( A
, B
) levantada a la mónada ( M[A]
, M[B]
), dada una flecha Kleisli A => M[B]
.
Entonces x
en x => f(x)
es el valor que se levanta.
Descargo de responsabilidad: definitivamente no soy un experto en terminología de programación funcional y espero que lo siguiente no sea una respuesta a su pregunta desde su punto de vista. Para mí, el problema es más bien: si elegir un término requiere conocimiento experto, también lo hace la comprensión.
La elección de un término apropiado depende en gran medida de:
- el nivel deseado de corrección lingüística, y
- Su audiencia, y las connotaciones correspondientes de ciertos términos.
Con respecto a la corrección lingüística, la pregunta es si desea referirse adecuadamente a los valores / datos que están vinculados a x
, o si puede vivir con una cierta abstracción (incorrecta). En términos de audiencia, me gustaría diferenciar principalmente entre una audiencia con una sólida formación en programación funcional y una audiencia proveniente de otros paradigmas de programación. En el caso de los primeros, la elección del término probablemente no sea del todo crucial, ya que el concepto en sí es familiar y muchos términos conducirían a la asociación correcta. La discusión en los comentarios ya contiene algunas sugerencias muy buenas para este caso. Sin embargo, la discusión también muestra que necesita un cierto fondo en programación funcional para ver la razón detrás de algunos términos.
Para una audiencia sin experiencia en programación funcional, preferiría sacrificar la corrección lingüística en favor de la comprensibilidad. En tal situación, a menudo me refiero a él como "tipo subyacente", solo para evitar cualquier confusión que probablemente crearía al referirme a la "cosa (s) en la mónada". Obviamente, es literalmente incorrecto decir que " x
está vinculada al tipo subyacente". Sin embargo, es más importante para mí que mi audiencia entienda un concepto. Como la mayoría de los programadores están familiarizados con los contenedores y sus tipos subyacentes, apunto a la asociación (defectuosa) "tipo subyacente" => "las cosas que están en un contenedor" => "las cosas dentro de un mónada ", que a menudo parece funcionar.
TL; DR: Siempre hay un equilibrio entre la corrección y la accesibilidad. Y cuando se trata de programación funcional, a veces es útil cambiar el sesgo hacia esta última.
''Item'' parece bueno? ''Parámetro del elemento'' si necesita ser más específico.
Los datos de origen pueden contener varios elementos o la operación puede llamarlos varias veces. El elemento tiende a ser más específico para el primer caso, el valor es singular en cuanto a la fuente y no es sensible para los usos de la lista, pero el artículo cubre todos los casos correctamente.
Descargo de responsabilidad: sé más sobre el inglés comprensible que sobre FP.