Bienvenido, les saluda Luis y para hoy les traigo este nuevo artículo.
Índice
¿Y qué significa en el mundo de la programación funcional?
Bienvenido a la serie sobre programación funcional. Durante esta publicación, voy a explicar los conceptos de FP de la manera más fácil que pueda.
Todavía estoy estudiando Programación funcional. Pero, como saben, comprender cada concepto de PF es muy confuso.
Hablemos primero sobre el magma antes de pasar al tema principal
¿Por qué quiero hablar de Magma de repente? Porque casi todos los conceptos de FP no existen de forma aislada. En su mayoría provienen de sus conceptos parecidos a los de los padres.Es así que debes estar pendiente de qué es el deporte para entender qué es el fútbol. Semigroup proviene de Magma, y Magma es el concepto raíz de muchos conceptos existentes en FP.
Digamos que tenemos una matriz que consta de números [1, 2, 3]
, y algunas funciones funcionan de la siguiente manera.
const magmas = { add: (x: number, y: number): number => x + y, sub: (x: number, y: number): number => x - y, mul: (x: number, y: number): number => x * y, div: (x: number, y: number): number => x / y, };
Todas las funciones en magmas
son dos funciones arity que toman dos números y devuelven un número. Por ejemplo, magmas.sub(5, 3)
es igual a 2
, un número.
Digamos que hay un conjunto de algunos elementos, S
, que todos son de tipo T
(tipo de número, en este ejemplo). Y tienes que elegir cualquier par de elementos de S
, una y b
.
Si el resultado de a · b
es también un elemento de tipo T
, que es miembro de S
, y si esto funciona con cada dos elementos aleatorios en S
, S
se considera Magma. (El símbolo ·
en este ejemplo significa cualquier operación que trabaja propiedad con dos elementos).
Magma: a ∈ S, b ∈ S --> a·b ∈ S
Por ejemplo, si ·
solo contiene las cuatro operaciones binarias, +
, -
, *
y /
, entonces todas las funciones magmas
siempre devuelven un elemento de tipo Número
después de operar su cálculo.
¿Qué es Semigroup?
De acuerdo, dije anteriormente en esta publicación que Semigroup
proviene de Magma
. Magma
es un conjunto de elementos que siempre asegura que todos los elementos sigan siendo del mismo tipo de elemento después de operar, como sumar o restar.
Básicamente, si un conjunto, S
, de elementos va a ser Semigroup
, cada elemento debe cumplir la condición de Magma
. Además, también deben cumplir con la siguiente regla.
Si b
y c
son un miembro de un conjunto S
y donde ·
es una operación binaria, ( un · b
) · c
debe ser igual a un ·
( b · c
). Ambos de sus resultados debe ser un miembro de S
.
Semigroup: a ∈ S, b ∈ S, c ∈ S --> (a·b)·c = a·(b·c) ∈ S
Y esta característica se llama «asociatividad» en el mundo de FP.
Ampliemos nuestro ejemplo anterior utilizado en el capítulo Magma. Lo que voy a hacer con esto es dejar que los métodos tomen un argumento más.
const semigroups = { mul: (x: number, y: number, z: number): number => x * y * z, };
Ahora son tres funciones arity que toman tres argumentos y devuelven un elemento de tipo Number
.
semigroups.mul(5, 3, 2) = 10
Al multiplicar esos tres números, el orden de multiplicarlos no importa. (5 * 3) * 2 = 5 * (3 * 2)
. El lado izquierdo le da 30
como resultado, al igual que el lado derecho.
(5 / 3) / 2 = 0.8333...34 5 / (3 / 2) = 3.3333...35
Pero en este ejemplo, cada resultado le da un valor diferente. Entonces (5/3) / 2
no es igual a 5 / (3/2)
; esto no puede ser un operador de Semigroup
.
Pero ya confirmamos que la multiplicación puede ser un operador de Semigroup
. Entonces podemos decir que (Número
, *
) es un grupo Semi
. (Como puede ver en la palabra «grupo», Semigroup
se refiere a un par de un conjunto de algunos tipos y un operador binario).
Ahora es su turno de pensar si más (+)
, menos (-)
y división (/)
pueden ser operadores de Semigroup
.
¿Cómo utilizan esto otras bibliotecas de programación funcional?
Hay algunas bibliotecas FP por ahí. Veamos el más famoso, la tierra de la fantasía.
Fantasy-land
es más como una especificación sobre programación funcional. De modo que las bibliotecas de programación funcional modernas suelen seguir la guía de la tierra de la fantasía.
En la tierra de la fantasía , Semigroup es ligeramente diferente. Su Semigroup
debe contener el método llamado concat
, y concat
debe ser inocente en términos de asociatividad.
const concat = (x: string, y: string, z: string): string => { return x + y + z; };
Comprobemos si concat
realmente cumple con todas las condiciones que necesita Semigroup
.
1. ¿Este método siempre asegura que es Magma
?
Si. Si x
es “I”, y
es “similar”, y z
es “FP”, x
, y
, y z
son un miembro de cadena y x+y+z
(IlikeFP) es también un miembro de cadena.
2. ¿Este método siempre asegura que sea Semigroup
?
Si. Si x
es “I”, y
es “similar”, y z
es “FP”, x
, y
, y z
son un miembro de cadena y (x+y)+z
(IlikeFP) es igual a x+(y+z)
(IlikeFP).
Hablamos de Magma
y Semigroup
; ambos son conceptos importantes en FP. No dan demasiado miedo. Todo lo que necesita hacer es intentar crear sus propios ejemplos.
Te recomiendo que revises la especificación de la tierra de fantasía.
Gracias por leer este artículo.
[…] “Serie de programación funcional (1): ¿Qué es un semigrupo? « […]