Teniendo en cuenta que:

Derivada   f   x = lim h   0   f   ( x + h ) f   x h

Se puede hacer una definición de la función derivada en Haskell como:


derivada :: (Double -> Double) -> Double -> Double
derivada f x = ( f(x + h) - f x ) / h
		where h = 0.0001

Considerando que la derivada de f(x) = x2 es f'(x) = 2x, testeamos la definición:


*Main> derivada (x -> x^2) 2
4.0001000000078335

Afinando la definición de h:


derivada :: (Double -> Double) -> Double -> Double
derivada f x = ( f(x + h) - f x ) / h
		where h = 0.00000000001

Da como resultado:


*Main> derivada (x -> x^2) 2
4.000000330961484

Independientemente ( o más bien a pesar ) de los problemas Inherentes a la aritmetica de punto flotante, se ve que Cuando h tiende a 0 más se acerca al resultado esperable.

Aplicación Parcial (Currying)

Se puede usar la definición de derivada anterior para producir una función y no un resultado, ej:


casiPor2 :: (Double -> Double)
casiPor2  = derivada (x -> x^2)

Que si bien no es equivalente a x -> 2 * x, (por los problemas de la aritmetica de punto flotante), se le acerca.

Una versión de testeo con diversos niveles de acercamiento.

Esto es interesante para entender gráficamente el concepto de limite.


derivada3 :: (Double -> Double) -> Double -> Double ->Double
derivada3 f x h = (f(x + h) - f x ) / h

tiendeA0 :: Double -> [Double]
tiendeA0 h = h : ( tiendeA0 (h*0.1) )

Testeo de tender a 0:


*Main> take 10 (tiendeA0 1)
[1.0, 0.1, 1.0000000000000002e-2, 1.0000000000000002e-3, 1.0000000000000003e-4, 1.0000000000000004e-5, 1.0000000000000004e-6, 1.0000000000000005e-7, 1.0000000000000005e-8, 1.0000000000000005e-9]

Ahora considerando que: f(x) = x^3 => f'(x) = 3x^2 y En particular si x=2, f'(x) = 3x^2 = 3.4 = 12; podemos probar su aplicación para ver el comportamiento extraño del punto flotante.


*Main> map ( derivada3 (x -> x^3) 2 ) (take 10 (tiendeA0 1))
[19.0, 12.61000000000001, 12.060099999999705, 12.006000999999596, 12.000600010022563, 12.00006000026121, 12.000006002210734, 12.000000584322374, 11.999999927070343, 12.000000992884447]

Referencias

Razonando con Haskell;Blas C. Ruiz, Francisco Gutiérrez, Pablo Guerrero y José E. Gallardo;Thomson Editores Spain;2004

Calculus; M. Spivak; Editorial Reverte; 1992

Algebra de Boole Aplicada a Circuitos de Computación; M. C. Guinzburg; Biblioteca Técnica Superior; 1998