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?