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:
RecordWildCardspermite 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 alcancexcon el valor coincidente para el campoxetc.NamedFieldPunspermite escribirC{name}para que sea equivalente aC{name=name}, por lo que esenameestá 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í.