correspondencia de patrones y correspondencia de patrones anidada en OCaml
Tengo este código OCaml:
type color_primario = Rojo | Verde | Azul
let r = Rojo
type punto = float * float
type forma =
| Circulo of {centro : punto; radio : float}
| Rectangulo of {inferior_izquierdo : punto; superior_derecho : punto}
let c1 = Circulo {centro = (0., 0.); radio = 1.}
let r1 = Rectangulo {inferior_izquierdo = (-1., -1.); superior_derecho = (1., 1.)}
let promedio a b =
(a +. b) /. 2.
y las siguientes funciones centro
que calculan el centro de las diferentes formas:
(* Función uno usando let (...) = ... *)
let centro f =
match f with
| Circulo {centro; radio} -> centro
| Rectangulo {inferior_izquierdo; superior_derecho} ->
let (x_li, y_li) = inferior_izquierdo in
let (x_sd, y_sd) = superior_derecho in
(promedio x_li x_sd, promedio y_li y_sd)
(* Función dos usando coincidencias de patrones anidadas Rec{ a = ..., b = ...} *)
let centro f =
match f with
| Circulo {centro; radio} -> centro
| Rectangulo {inferior_izquierdo = (x_l, y_l); superior_derecho = (x_r, y_r)} ->
(promedio x_l x_r, promedio y_l y_r)
| Punto p -> p
No entiendo completamente cómo funciona la sintaxis de patrones aquí.
¿Cómo se pasan los valores x_ll
e y_ll
a la función promedio
en las primeras y segundas funciones para calcular el centro? Porque a) el par (x_ll, y_ll)
no se asigna a una variable y b) los valores de los pares se pasan directamente sin utilizar, por ejemplo, let x_ll (a, b) = a
.
davy.ai
En OCaml, la sintaxis de patrones permite la desestructuración, o el desempaquetado, de estructuras de datos como tuplas y registros. En las primeras y segundas funciones para calcular el centro, los valores
x_ll
yy_ll
se extraen del campo de registrolower_left
de la formaRectangle
utilizando una coincidencia de patrones. El patrón(x_ll, y_ll) = lower_left
asigna los valores de la tuplalower_left
a las variablesx_ll
yy_ll
. Estas variables se utilizan luego como argumentos para la funciónavg
. De manera similar, en la segunda función, la coincidencia de patrones anidadaRectangle { lower_left = (x_l, y_l); upper_right = (x_r, y_r) }
asigna los valores de los campos de registrolower_left
yupper_right
a las variablesx_l
,y_l
,x_r
, yy_r
. Estas variables se utilizan luego como argumentos para la funciónavg
. Hay que tener en cuenta que el tercer caso en la segunda función no es relevante para las formas dadas y probablemente sea un error.