Red de conocimientos turísticos - Conocimientos sobre calendario chino - ¿Por qué muchos lenguajes de programación utilizan la coincidencia de patrones como un componente importante?

¿Por qué muchos lenguajes de programación utilizan la coincidencia de patrones como un componente importante?

En pocas palabras, la coincidencia de patrones proporciona una manera conveniente de deconstruir estructuras de datos, y la sintaxis de construcción y desestructuración es similar (o incluso la misma), lo que puede mejorar la coherencia del lenguaje.

p>

Tomemos Rust, cuya sintaxis es relativamente similar a la del C tradicional, como ejemplo

struct Point {

x: i32,

y: i32,

}

let origin = Punto { x: 0, y: 0 };

//^^^^^^^^Construcción^ ^^^^^ ^^^

coincidencia de origen {

Punto { x: x, y: y } => println!("({},{})", x, y),

//^^^^^^^^Deconstrucción^^^^^^^^^

}

vía Patrones

Sin embargo, es inconveniente utilizar la coincidencia de patrones para deconstruir estructuras de datos. Cuando la estructura de datos es relativamente "superficial", la coincidencia de patrones es aún más fácil de usar, como en el ejemplo anterior, pero cuando la estructura de datos lo es. relativamente "profundo", es un poco problemático realizar operaciones de obtención/establecimiento en *solo* lenguajes de coincidencia de patrones

data Person = P { name :: String

, addr : : Dirección

}

datos Dirección = A { calle :: Cadena

, ciudad :: Cadena

, código postal :: Cadena

}

setPostcode :: Cadena -> Persona -> Persona

setPostcode pc p = p { addr = addr p { postcode = pc }}

vía /Tech/Haskell%20Exchange%202013

Debido a que el miembro del código postal está oculto relativamente profundamente, si desea establecer el código postal una vez, tendrá que realizar muchas deconstrucciones. Esta situación. Definitivamente existirá en la práctica. Piense en varias incrustaciones de un nivel. Una solución es usar una variable intermedia para obtener la dirección primero y luego obtener el código postal. Esto pierde la conveniencia de reducir las variables intermedias que @Xiao. Jian mencionó en el comentario.

¿No sería más conveniente si pudiéramos usar "." para acceder a él como OO: person.address.postcode = newPostcode

Ir? Más profundo y desviarse del contenido de la discusión del tema, sobre ".", puede leer La esencia del acceso a datos en cω de Erik Merijer: El poder está en el punto

La solución de Haskell a este problema es la. Lente de biblioteca: lentes, pliegues y recorridos. Esta es una introducción simple/patrickt/d43031e3b69f1a4ff8c9. Recuerde, ¡nunca mire la implementación, nunca!