28

Ho sentito spesso affermare che Haskell non ha variabili; in particolare, this answer afferma di non esserlo, ed è stato upvoted almeno nove volte e accettato.Haskell ha variabili?

Quindi ha variabili o no, e perché?

Questa domanda sembra anche applicare ML, F #, OCaml, Erlang, Oz, Lava e tutte le lingue intermedie SSA.

risposta

47

Haskell ha variabili immutabili (variabili nel senso matematico) di default:

foo x y = x + y * 2 

da variabili di default non sono cellule mutevoli.

Haskell ha anche le cellule mutabili, però, ma li abilitare esplicitamente:

> v <- newIORef 0 
> readIORef v 
0 

> writeIORef v 7 
> readIORef v 
7 

Quindi, SI Haskell ha vere variabili. Ma non usa variabili mutabili per impostazione predefinita.

4

Sì, Haskell ha variabili. Si consideri la (sostanzialmente equivalente) definizioni

inc n = n + 1 
inc = \n -> n + 1 

In entrambi i casi, n è una variabile; assumerà diversi valori in momenti diversi. Lo Haskell Report, in Section 3 si riferisce a questi esplicitamente come variabili.

Questo n qui è una variabile può essere più facile per vedere se consideriamo il seguente programma completo:

inc n = n + 1 
f = inc 0 
g = inc 1 
main = print (f+g) 

La risposta stampata sarà "3", naturalmente. Nel valutare f, come noi espandere incx assumerà il valore 0, e quando più tardi (o prima!) Valutare g, come noi espandere incx assumerà il valore 1.

È possibile che si sia verificata una certa confusione perché Haskell, come le altre lingue elencate nella domanda, è un linguaggio a assegnazione singola: non consente la riassegnazione di variabili all'interno di un ambito. Una volta n è stato assegnato il valore 42, non può essere altro che 42 senza introdurre un nuovo ambito con un nuovo n (che è una variabile diversa, che ombreggia l'altro n) associato a un altro valore.

Questo può non essere del tutto evidente in alcuni contesti, come ad esempio le espressioni utilizzando do:

do let n = 1 
    print n 
    let n = 2 
    print n 

ma se si rimuove lo zucchero sintattico, traducendolo in Haskell senza il do, diventa chiaro che c'è stata una nuovo, ambito nidificato creato dove la n in tale ambito interno è una variabile che è differente shadowing il n del perimetro esterno:

(let n = 1 
    in (print n >> (let n = 2 
        in print n))) 
+1

Non ci sono variabili a Haskell! Le variabili possono essere riassegnati. Quello che hai in funzioni o let-binding non è altro che una funzione immutabile argomento, un valore associato a un nome! – Dario

+6

Dario, wikipedia non è d'accordo, elencando nove lingue in cui tutte le variabili sono a assegnazione singola e altre cinque in cui l'assegnazione singola è un'opzione: http://en.wikipedia.org/wiki/ Single_assignment Inoltre, i matematici, che hanno ideato il termine, usano anche le variabili nel senso di assegnazione singola.Se hai intenzione di discuterne, come pubblicare una risposta dettagliata che mostri perché questa è una vista errata? –

3

"Ho sentito che Haskell non ha variabili. ? È vero".

No

"Allora ce l'ha variabili o no, e perché"

Yes.

EDIT:? La mia risposta provoca un doppio negativo, che è naturalmente confuso perché la domanda principale è positiva mentre il corpo non lo è :)

EDIT2: modificato di nuovo, poiché l'OP ha cambiato la domanda.

+1

cita la domanda che hai risposto? Ora quando apro questa domanda intitolata "Haskell ha variabili?" la prima risposta che vedo è "No". (Ovviamente, in realtà non ho letto tutta la domanda, solo il titolo.) –

8

La risposta semplice è: sì, Haskell ha variabili come definito in Section 3.2 of the Haskell Report. Le variabili possono apparire in pattern e possono quindi essere associate a un valore usando costrutti come let, case e list comprehensions.

Forse implicito nelle vostre domande è se una variabile viene correttamente chiamata variabile se è immutabile. Penso che le altre risposte coprano sufficientemente la mutabilità.

3

Secondo [Wikipedia] (http://en.wikipedia.org/wiki/Variable_(programming)), sì, Haskell ha variabili:

Nella programmazione di computer, una variabile è un identificatore (di solito una lettera o una parola) che è collegato a un valore memorizzato nella memoria del sistema o un'espressione che può essere valutata. ad esempio, una variabile può essere chiamato "TOTAL_COUNT" e contengono un numero.
dei linguaggi di programmazione, i valori possono generalmente accedere o modificate in qualsiasi momento. Tuttavia, a puro linguaggi funzionali e logici, le variabili sono legate alle espressioni e mantengono un singolo valore durante thei r intera durata a causa dei requisiti di trasparenza referenziale. Nelle lingue imperative, lo stesso comportamento è mostrato dalle costanti, che sono in genere in contrasto con le variabili normali.

Non tutte le definizioni di Wikipedia sono perfettamente affidabili, ovviamente.

La pagina su [variabili matematiche] (http://en.wikipedia.org/wiki/Variable_(mathematics)) possono fornire ulteriori indicazioni circa questo.

Problemi correlati