2012-07-17 10 views
6

Sono un grande principiante di Haskell, in realtà ho appena iniziato 10 minuti fa. Sto cercando di capire come definire una variabile all'interno di una funzione. Diciamo che ho la funzioneDefinizione delle variabili all'interno di una funzione Haskell

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

quando l'eseguo in GHCi ottengo un errore di sintassi! Come si può definire una variabile all'interno di una funzione?

+1

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

+0

let b = a * 2 in b –

+12

Leggi [Learn You a Haskell] (http://learnyouahaskell.com). –

risposta

1

Ignorando la correttezza tecnica, la risposta è "sorta di".

Penso che sia meglio pensare a una variabile come funzione di zero argomenti che valutano un determinato valore.

module Main where 
import System.IO 

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

main = do 
    putStrLn $ show $ foo 10 
+11

Non è una funzione di argomenti zero. Ogni funzione in Haskell richiede esattamente un argomento. –

+2

Per ulteriori informazioni su cosa ha detto Magnus, vedi il post del blog di Conal Elliott ["Tutto è una funzione" in Haskell?] (Http://conal.net/blog/posts/everything-is-a-function-in-haskell). –

+0

@MagnusKronqvist: Ti dispiacerebbe fornire un documento che fornisca la documentazione per questo? –

19

Ci sono due modi per farlo:

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

Nella maggior parte dei casi, la scelta tra i due è una estetica piuttosto che quello tecnico. Più precisamente, where può essere collegato solo alle definizioni, mentre let ... in ... può essere utilizzato ovunque sia consentita un'espressione. Entrambi where e let introducono blocchi, rendendo più variabili interne convenienti in entrambi i casi.

+0

Ehi, mi chiedevo come si definissero più variabili di aiuto all'interno di una funzione, si farebbe qualcosa come "dove b = a * 2, c = a * 3" o si userebbe un'istruzione "where" completamente diversa? –

+0

@EbenCowley Un singolo 'where' /' let' farà. Usa ';' per separare le dichiarazioni sulla stessa riga, o leggi le regole di indentazione per utilizzare più righe. (Questo è il significato dell'ultima frase del mio post.) –

Problemi correlati