2012-04-29 8 views
12

veces escribo código como esteEl uso de los protectores en Let .. en expresiones

solveLogic :: Int -> Int -> Int 
solveLogic a b = 
    let 
     x = 1 
     brainiac 
      | a >= x  = 1 
      | a == b  = 333 
      | otherwise = 5 
    in 
     brainiac 

Y cada vez que tengo ganas de escribir estas cosas sin "cerebrito" que no sean necesarios función, así:

solveLogic :: Int -> Int -> Int 
solveLogic a b = 
    let 
     x = 1 
    in 
     | a >= x  = 1 
     | a == b  = 333 
     | otherwise = 5 

Qué código es mucho más "Haskellish". ¿Hay alguna forma de hacer esto?

+4

'brainiac' no es una función, simplemente diciendo. –

Respuesta

39

Sí, utilizando una cláusula where:

solveLogic a b 
     | a >= x  = 1 
     | a == b  = 333 
     | otherwise = 5 
    where 
     x = 1 
10

Cuando quiero guardias como una expresión que utilizan este truco un poco fea

case() of 
_ | a >= x  -> 1 
    | a == b  -> 333 
    | otherwise -> 5 
+0

Tiene que ser '->' en lugar de '=' para los resguardos de mayúsculas y minúsculas. Todos menos el primer '_' se pueden omitir. – leftaroundabout

+0

Sí. Fijo. Demasiado cortar y pegar. – augustss

Cuestiones relacionadas