pattern - Haskell registro de patrones de coincidencia
pattern matching javascript (1)
Puedes usar patrones de grabación como este:
data X = A | B {name :: String} | C {x::Int, y::Int, name::String}
myfn :: X -> Int
myfn A = 50
myfn B{} = 200
myfn C{} = 500
Los patrones de registro le permiten dar nombres a los campos de los constructores. También puedes hacer cosas como:
myfn C{name=n} = length n
para que pueda ver que puede hacer coincidencias de patrones solo en el campo específico que necesita.
Nota: puede usar el patrón de registro vacío incluso con tipos de datos que no usan la sintaxis de registro:
data A = A Int | B Int Int
myfn A{} = 1
myfn B{} = 2
Esto esta bien. Hay una serie de otras extensiones relacionadas con los patrones de registro:
RecordWildCards
permite escribir cosas comoC{..}
que es equivalente al patrón:C{x=x, y=y, name=name}
, es decir, coincide con todos los campos y ahora tiene un alcancex
con el valor coincidente para el campox
etc.NamedFieldPuns
permite escribirC{name}
para que sea equivalente aC{name=name}
, por lo que esename
está ahora dentro del alcance y contiene el valor que coincide con el campo delname
.
Tenga en cuenta que el uso de patrones de registro no le impide utilizar sus constructores de forma posicional, por lo que aún puede escribir:
myfn (B _) = 200
Sólo añade funcionalidad.
Estoy buscando una manera de simplificar los patrones de función cuando no se requieren los datos reales:
data X = A | B String | C Int Int String
myfn :: X -> Int
myfn A = 50
myfn (B _) = 200
myfn (C _ _ _) = 500
¿Hay una manera de hacer un patrón más simple para hacer coincidir C, simplemente descartando los valores?
hsdev agrega una sugerencia "Sugerencia: utilice patrones de registro", pero Google no me ayudó allí.