2012-07-17 13 views
6

Soy un gran novato para Haskell, en realidad empecé hace 10 minutos. Estoy tratando de descubrir cómo definir una variable dentro de una función. Digamos que tengo la funciónDefinición de variables dentro de una función Haskell

foo :: Int -> Int 
foo a = 
    b = a * 2 
    b 
-- Yes, I know, it doesn't do anything interesting 

Cuando corro en GHCi me sale un error de sintaxis! ¿Cómo se puede definir una variable dentro de una función?

+1

Relacionado: http://stackoverflow.com/q/993124 –

+0

let b = a * 2 en b –

+12

Lea [Aprenda un Haskell] (http://learnyouahaskell.com). –

Respuesta

1

Sin tener en cuenta la corrección técnica, la respuesta es "tipo de".

Creo que es mejor pensar en una variable como una función de cero argumentos evaluando a un valor dado.

module Main where 
import System.IO 

foo :: Integer -> Integer 
foo a = 
    b where 
    b = a * 2 

main = do 
    putStrLn $ show $ foo 10 
+11

No es una función de cero argumentos. Cada función en Haskell toma exactamente un argumento. –

+2

Para obtener más información sobre lo que dijo Magnus, consulte la publicación de blog de Conal Elliott ["Todo es una función" en Haskell?] (Http://conal.net/blog/posts/everything-is-a-function-in-haskell). –

+0

@MagnusKronqvist: ¿Le importaría proporcionar un documento que proporcione la documentación para eso? –

19

Hay dos maneras de hacer esto:

foo a = b where b = a * 2 
foo a = let b = a * 2 in b 

En la mayoría de los casos, la elección entre ellos es una estética más que técnica. Más precisamente, where solo se puede adjuntar a definiciones, mientras que let ... in ... se puede usar en cualquier lugar donde se permita una expresión. Tanto where como let introducen bloques, lo que hace que múltiples variables internas sean convenientes en ambos casos.

+0

Hola, me preguntaba cómo definirías múltiples variables auxiliares dentro de una función, ¿harías algo como 'donde b = a * 2, c = a * 3' o usarías una declaración completamente diferente" donde "? –

+0

@EbenCowley Un solo 'where' /' let' hará. Use ';' para separar declaraciones en la misma línea, o lea sobre las reglas de sangría para usar múltiples líneas. (Este es el significado de la última frase de mi publicación). –

Cuestiones relacionadas