
Iniciado por
Chana
He escrito esto:
Código:
senn :: Double -> [Double]
senn x = [((-1)**( [1, 3..]!!n))*(1/fact(n))*(x**(n))|n<-[1, 3..]]
Pero no compila.
Bueno, como alternativa podría crear dos listas, una con los términos positivos y otra con los términos negativos. Luego se unen convenientemente y problema zanjado, pero quisiera saber si alguien puede ayudarme con ese lío que tengo de exponentes.
Creo que el problema va a ser que (-1) es negativo.
El operador (^) parece que podría arreglarme el problema, sin embargo no me compila si lo pongo.
Saludos, y felices fiestas.
Llevo con un gripazo y fiebre desde el viernes asi que no tengo mucho tiempo para meterme al foro
??:
Lo que has escrito ahi, desde luego no es el desarrollo en Taylor de la funcion seno (independientemente de que compile o no). Lo puedes ver comprobando que solo incluye terminos negativos.
Recuerdo cual es su desarrollo en serie (o al menos una de las formas posibles de escribirlo):
^n x^{2n+1}}{(2n+1)!})
Asi que podemos escribir el conjunto de sus n primeros terminos como:
 \equiv \left\{\left.\frac{(-1)^n x^{2n+1}}{(2n+1)!} \right| n \in \left\{0,1,...\right\}\right\})
Asi escrito lo tenemos a huevo para pasarlo a Haskell...
Código:
sinn x = [ (-1)^n * x^(2*n+1)/fact (2*n+1) | n <- [0,1..]]
NOTA: haskell puede inferir los tipos de lo que escribes!! Puedes ayudar al compilador a optimizar ciertas expresiones o documentar tu propio codigo escribiendolas tu, en este caso tu mismo has usado:
Código:
sinn :: Double -> [Double]
Es una buena practica de programacion ponerle los tipos, pero si estas aprendiendo puedes usar la inferencia de Haskell para aprender que tipos deberias haber puesto.
Por supuesto todavia queda dar una definicion de fact y aqui esta la clave para resolver los errores de compilacion que tenias:
Código:
fact :: (Integral a, Num b) => a -> b
fact n = fromIntegral (product [1..n])
Y que hace fromIntegral? pues lo que dice su nombre coge un numerito que estaba restringido a ser un entero y lo interpreta como cualquier numero dentro de la clase Num (enteros, double, float)
Las clases en Haskell y los tipos que pertenecen a dichas clases:
http://www.haskell.org/onlinereport/classes.gif
Y por que lo tienes que hacer asi? Pues porque:
Código:
(/) :: Fractional a => a -> a -> a
**O puedes usar cualquier de estas otras: http://www.willamette.edu/~fruehr/ha...evolution.html