Sto cercando di capire come funziona la valutazione pigra perché ho intenzione di implementare provare per implementarlo nel linguaggio di programmazione che sto sviluppando (so che non è è la cosa migliore da fare (cercare di implementare qualcosa che non capisci nemmeno) ma è una buona lezione attraverso il mondo dei linguaggi funzionali e simili), quindi stavo leggendo il documento A Gentle Introduction to Haskell .
Presto ho incontrato il paragrafo sulla non rigidità delle funzioni di Haskell e la possibilità di creare strutture di dati teoreticamente infinite, come mostrato in questo esempio:
numsfrom n = 1 : numsfrom (n + 1)
squares = map (^ 2) (numsfrom 0)
Ora, take 5 squares
restituirebbe [0, 1, 4, 9, 16]
, giusto? Bene, il mio problema è capire come lo farebbe.
Per prima cosa, questo è quello che ho capito della valutazione pigra:
lazy = lambda x, y: x or y
Assumendo Python non era severo, se passassi a lazy
1
e 5 ** 1000000
il secondo parametro non sarebbe stato valutato, ma sarebbe stato valutato se avessi passato False
come primo argomento, perché% ilor
avrebbe quindi richiesto.
Quindi quando si chiama take 5 squares
, squares
deve essere valutato: map
è chiamato con (^ 2)
e (numsfrom 0)
come argomenti; Ma poiché map
usa il suo secondo argomento, verrà valutato numsfrom 0
, iniziando un ciclo infinito.
Non riesco a capire come restituirà map
se sta valutando un ciclo infinito e cosa restituirebbe. Qualcuno può spiegarmi per favore?