es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for 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 y y_ll se extraen del campo de registro lower_left de la forma Rectangle utilizando una coincidencia de patrones. El patrón (x_ll, y_ll) = lower_left asigna los valores de la tupla lower_left a las variables x_ll y y_ll. Estas variables se utilizan luego como argumentos para la función avg. De manera similar, en la segunda función, la coincidencia de patrones anidada Rectangle { lower_left = (x_l, y_l); upper_right = (x_r, y_r) } asigna los valores de los campos de registro lower_left y upper_right a las variables x_l, y_l, x_r, y y_r. Estas variables se utilizan luego como argumentos para la función avg. 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.

Comments are closed.