Sto cercando di integrare numericamente una funzione in Haskell usando la regola trapezoidale, restituendo un anti-derivato che accetta gli argomenti a, b, per i punti finali dell'intervallo da integrare.Haskell: clausola where che fa riferimento a variabili associate in lambda
integrate :: (Float -> Float) -> (Float -> Float -> Float)
integrate f
= \ a b -> d * sum [ f (a + d*k) | k <- [0..n] ] - d/2.0 * (f a + f b)
where
d = (b - a)/n
n = 1000
In quanto sopra, io uso
n - for the number of subintervals
d - for the width of each subinterval
Questo quasi funziona, tranne che per gli argomenti legati a, b nel lambda. Ricevo il seguente messaggio di errore :
Not in scope: `b'
Not in scope: `a'
posso capire che l'ambito di a, b è limitato solo a questo espressione lambda, ma c'è una soluzione alternativa in Haskell in modo che non devo scrivere (ba)/n per ogni occorrenza di d in quanto sopra?
TIL: Non è possibile utilizzare 'WHERE' con lambda [lasciare vs dove] (http://www.haskell.org/haskellwiki/Let_vs._Where). Vedi anche [dove la clausola 'where' è utile in Haskell] (http://stackoverflow.com/questions/6032183/where-does-the-where-clause-come-in-handy-in-haskell) – rampion
grazie a tutti quelli che hanno risposto. Non mi ero reso conto che questo problema porta direttamente a una ben nota let vs dove la discussione. Voglio anche ringraziare coloro che hanno suggerito di scrivere la funzione come: integrare f a b = ... Questa è una soluzione carina e succinta. – Bylextor