5

En al menos algunos de los idiomas de la familia ML, puede definir registros en los que puede realizar la coincidencia de patrones, p. http://learnyouahaskell.com/making-our-own-types-and-typeclasses - la idea básica es que defina un tipo de registro con campos con nombre, se crea automáticamente un constructor con esos campos como parámetros para que pueda crear registros de ese tipo, y se crea automáticamente un extractor con esos campos como parámetros para que pueda coincidir en registros de ese tipo.¿Lenguaje Scala único con extractores sobrecargados?

Scala da un paso más y permite que los campos almacenados en el registro, los parámetros del constructor y los parámetros del extractor se desacoplan entre sí, p. http://daily-scala.blogspot.com/2009/11/overloaded-unapply.html - en esto está cumpliendo con su objetivo de apoyar tanto la programación orientada a objetos como la funcional. (Por supuesto, los lenguajes orientados a objetos permiten que los campos almacenados y los parámetros del constructor se desacoplen, aunque normalmente no tienen extractores).

¿Hay otros idiomas que tengan coincidencia de patrones y permitan dicho desacoplamiento?

¿Se ha escrito algo sobre los pros y los contras de tal desacoplamiento?

+0

Haskell es un lenguaje familiar ML? – millimoose

+4

Nunca los usé, pero las vistas de Haskell son similares – Owen

+0

Y por supuesto, los lenguajes dinámicos como Scheme lo permiten sin soporte de idiomas, pero no sé si alguien lo usa – Owen

Respuesta

9

Admito que no tengo el 100% de los conocimientos necesarios para comprender su pregunta, pero puedo decir que F # tiene una función llamada "Active Patterns" que parece podría usarse para construir la misma funcionalidad que su daily-scala enlace demuestra.

¿Es eso en el barrio de lo que estás buscando?

5

No, F # también proporciona esa característica.

Ejemplos en el segundo artículo se pueden implementar utilizando Partial Active Patterns:

let (|String|_|) = function "s" -> Some "yay" | _ -> None 
let (|Int|_|) = function 1 -> Some "hmm" | _ -> None 

let (|StringList|_|) = function "x" -> Some [1; 2; 3] | _ -> None 
let (|IntList|_|) = function 1 -> Some ["one"; "two"] | _ -> None 

match 1 with 
| Int s -> printfn "%O" s 
| _ -> printfn "Unmatched" 

match "s" with 
| String s -> printfn "%O" s 
| _ -> printfn "Unmatched" 

match "x" with 
| StringList [x; y; z] -> printfn "%O" (x, y, z) 
| _ -> printfn "Unmatched" 

match 1 with 
| IntList [x; y] -> printfn "%O" (x, y) 
| _ -> printfn "Unmatched" 

Patrones activo es una técnica poderosa, incluso se puede escribir de una manera recursive. Su combinación con la coincidencia de patrones proporciona un práctico conjunto de herramientas para desestructurar los datos. Sin embargo, la coincidencia de patrones es inagotable, por lo que debe usar el comodín (_) como último patrón.

4

Hay una larga historia de los patrones de primera clase en los lenguajes funcionales mecanografiadas.

En Haskell land, utilizamos la extensión -XViewPatterns para patrones programáticos.

Los primeros verdaderos patrones de vista se remontan al papel de Phil Wadler 1987 en views

Cuestiones relacionadas