una - Haskell patrón de coincidencia-cómo utilizar constantes variables
variables y constantes en java (4)
Bueno, Haskell no unifica nombres como este. Esos nuevos identificadores ''myValue1'' y ''2'' son nuevas variables que estás vinculando.
La forma más acertada de Haskelly es usar tipos fuertes y la coincidencia de patrones:
data Values
= D1
| D2
myFunc :: Values -> Bool
myFunc D1 = True
myFunc D2 = False
Dándole una garantía estática, solo se puede pasar "1" o "2" a myFunc, la coincidencia simbólica adecuada e incluso se retiene la conversión a números enteros derivando Enum.
Idealmente me gustaría escribir algo como esto:
myValue1 = 1 :: Int myValue2 = 2 :: Int myFunc :: Int -> Bool myFunc myValue1 = True myFunc myValue2 = False
Llamar a myFunc myValue2
devuelve True
, no lo que pretendo. Sé por qué sucede esto, pero ¿hay una manera de expresar esto en Haskell sin recurrir a las declaraciones #define
estilo C?
No se puede hacer coincidir con los valores de las variables como explicó Don.
Pero puedes usar guardias en este caso:
myValue1 = 1 :: Int
myValue2 = 2 :: Int
myFunc :: Int -> Bool
myFunc x
| x == myValue1 = True
| x == myValue2 = False
Si la idea es simplemente definir algunas constantes para usar en patrones, también puede usar la extensión de idioma PatternSynonyms
:
{-# LANGUAGE PatternSynonyms #-}
pattern MyValue1 = 1
pattern MyValue2 = 2
myFunc :: Int -> Bool
myFunc MyValue1 = True
myFunc MyValue2 = False
Si no desea crear otro tipo de datos, la solución habitual es utilizar guardas:
myValue1 = 1 :: Int
myValue2 = 2 :: Int
myFunc :: Int -> Bool
myFunc val | val == myValue1 = True
| val == myValue2 = False
Lo que pones después de la tubería puede ser cualquier condición booleana; Si es cierto, se ejecutará el cuerpo de la función correspondiente.