2012-03-15 12 views
16

Sé que no se mantienen en las coincidencias de patrones (es decir, necesita volver a escribir la cláusula 'dónde' para cada patrón), pero ¿cómo funciona el alcance para los guardias?En Haskell, ¿cuál es el alcance de una cláusula where cuando se trata de guardias?

p. Ej. ¿Esto funciona?

myFunction x1 x2 
    | x1 > x2 = addOne x1 
    | x1 < x2 = addOne x2 
    | otherwise = x1 
     where addOne = (1+) 

¿O debería ser esto?

myFunction x1 x2 
    | x1 > x2 = addOne x1 
     where addOne = (1+) 
    | x1 < x2 = addOne x2 
     where addOne = (1+) 
    | otherwise = x1 

Respuesta

16

El primero es el correcto. Sugiero que eche un vistazo a la página let vs where en la wiki de haskell, es una buena lectura (y también explica cómo lidiar con el alcance). Al igual que una nota, nunca debe repetir las mismas definiciones ... es una señal de que su código debe estructurarse de otra manera.

5

El alcance de la cláusula where es la ecuación completa, por lo que su primer ejemplo funciona.

Cuestiones relacionadas