Estoy tratando de integrar numéricamente una función en Haskell usando la regla trapezoidal, devolviendo una anti-derivada que toma los argumentos a, b, para que se integren los puntos finales del intervalo.Haskell: where cláusula referenciando variables enlazadas en 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
En lo anterior, utilizo
n - for the number of subintervals
d - for the width of each subinterval
Esto casi funciona, a excepción de los argumentos ligados a, b en el lambda. Consigo el mensaje de error :
Not in scope: `b'
Not in scope: `a'
me puede entender que el alcance de a, b se limita sólo a eso expresión lambda, pero Hay una solución alternativa en Haskell para que yo no tengo que escribir (ba)/n para cada ocurrencia de d en lo anterior?
TIL: No se puede usar 'WHERE' con lambdas [dejar vs donde] (http://www.haskell.org/haskellwiki/Let_vs._Where). Ver también [dónde hace la cláusula 'where' ser útil en Haskell] (http://stackoverflow.com/questions/6032183/where-does-the-where-clause-come-in-handy-in-haskell) – rampion
Gracias a todos los que respondieron. No me di cuenta de que este problema conduce directamente a un debate conocido entre nosotros. También quiero agradecer a aquellos que me sugirieron que escribiera la función como: integrar f a b = ... Esa es una solución agradable y sucinta también. – Bylextor