In primo luogo, sono appena iniziato con la programmazione funzionale, quindi apprezzerei le correzioni in qualsiasi terminologia che potrei aver usato in modo errato.
Il tempo della storia, mentre facevo un Project Euler Problem 1 in Haskell, mi sono imbattuto in una soluzione simile a
sum [3,6..999] + sum [5,10..999] - sum[15,30..999]
Quale somma viene valutata in
foldl (+) [x1,x2,x3,x4,x5,x6,etc] -- yep, the sum is evaluated one element at a time
Quindi, la mia comprensione è che la valutazione lazy significa quella somma ( 2 ) potrebbe essere ottimizzato per modellare la corrispondenza con l'enumerazione ( 3 ) in modo che invece di piegarlo potrebbe ottimizzare per casi speciali come
Tuttavia,almenoinHaskell,nonèpossibileeseguireloschemadicorrispondenzaeacquisiregliargomentidaun'altrafunzione.L'ideadibasesarebbeselasommadebbaessereabbastanzaintelligentedariconoscerelaformulamatematicaconosciutaperl'ottimizzazionedelcalcolovalutandoaltrefunzionistesse:
--Doesn'twork;didn'tintendto;notvalidHaskell--Tryknownformulasfirstifthelistgeneratorisknown--Thiswouldmatchsum[1..100]andreturn5050inO(1)sum'EnumFromTo'1n=n*(n+1)/2--Ifthesumisnotrecognizedthenitwoulddoit1by1asafallbackinO(n)--Thisisthecurrentandonlyimplementationofsumsum=foldl(+)0
Direichesarebbepiùfacile,piùdirettoebetterstyledefinireunanuovafunzionedisommaconunnomediversochecopralaformuladatacome
sumTon|n>=1=n*(n+1)/2
Maconcettualmenteparlando
- Èpossibileridefinirefunzionispecificheall'internodiun'altrafunzione?
- Permetterebbequestapausaqualcosa?(IE,inquestocaso,"EnumFromTo 1 n" non verrebbe valutato, ma la somma restituirebbe comunque il risultato corretto)
- Esistono esempi di questo schema di valutazione?
- Questo è un concetto che implementa qualsiasi linguaggio di programmazione?