variable una tiempo que matematicas lenguaje exponentes definicion constantes constante haskell pattern-matching

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.