2010-09-16 34 views
15

que lo ideal sería escribir algo como esto:patrón de juego Haskell - cómo utilizar constantes variables

 
myValue1 = 1 :: Int 
myValue2 = 2 :: Int 

myFunc :: Int -> Bool 
myFunc myValue1 = True 
myFunc myValue2 = False 

Calling myFunc myValue2 vuelve True - no lo que pretendo. Sé por qué sucede esto, pero ¿hay alguna forma de expresar esto en Haskell sin recurrir a las declaraciones de estilo C #define?

+0

Gracias ¡todos, por las respuestas extremadamente rápidas! – Kevin

Respuesta

22

Bueno, Haskell no unifica nombres como este. Esos nuevos identificadores 'myValue1' y '2' son nuevas variables que está vinculando.

La forma más Haskelly es el uso de tipos fuertes y la coincidencia de modelos:

data Values 
    = D1 
    | D2 

myFunc :: Values -> Bool 
myFunc D1 = True 
myFunc D2 = False 

que le da una garantía estática única "1" o "2" puede ser pasado a myFunc, juego simbólico adecuado, e incluso se conservan conversión a enteros derivando Enum.

+0

Gracias, esto parece ser lo más cercano a lo que quiero hacer, no había pensado en derivar a Enum, que será solo el boleto. – Kevin

6

Si no desea crear otro tipo de datos, la solución habitual es el uso de guardias:

myValue1 = 1 :: Int 
myValue2 = 2 :: Int 

myFunc :: Int -> Bool 
myFunc val | val == myValue1 = True 
      | val == myValue2 = False 

Lo que se pone detrás de la misma puede ser cualquier condición booleana; si es verdadero, se ejecutará el cuerpo de la función correspondiente.

12

No puede hacer coincidir los valores de las variables como Don explicó.

pero se puede usar protectores en este caso:

myValue1 = 1 :: Int 
myValue2 = 2 :: Int 

myFunc :: Int -> Bool 
myFunc x 
    | x == myValue1 = True 
    | x == myValue2 = False 
1

Si la idea es sólo para definir algunas constantes a utilizar en los patrones, también puede utilizar la extensión del lenguaje PatternSynonyms:

{-# LANGUAGE PatternSynonyms #-} 

pattern MyValue1 = 1 
pattern MyValue2 = 2 

myFunc :: Int -> Bool 
myFunc MyValue1 = True 
myFunc MyValue2 = False 
Cuestiones relacionadas