Skip to content

Instantly share code, notes, and snippets.

@sim642
Created February 2, 2020 21:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sim642/0062a0180084a19a0ae2aad40f69b9c2 to your computer and use it in GitHub Desktop.
Save sim642/0062a0180084a19a0ae2aad40f69b9c2 to your computer and use it in GitHub Desktop.
module SICPInfSeries where
-- SICP, exercise 3.59
integrateSeries :: Fractional a => [a] -> [a]
-- integrateSeries s = helper s 1
-- where helper (a:as) n = a / n : helper as (n + 1)
integrateSeries s = zipWith (/) s nats
where nats = 1 : map (+1) nats
expSeries :: Fractional a => [a]
expSeries = 1 : integrateSeries expSeries
cosineSeries, sineSeries :: Fractional a => [a]
cosineSeries = 1 : map negate (integrateSeries sineSeries)
sineSeries = 0 : integrateSeries cosineSeries
-- SICP, exercise 3.60
addSeries :: Fractional a => [a] -> [a] -> [a]
addSeries = zipWith (+)
mulSeries :: Fractional a => [a] -> [a] -> [a]
mulSeries (a:as) bb@(b:bs) = a * b : addSeries (map (*a) bs) (mulSeries as bb)
squareSeries :: Fractional a => [a] -> [a]
squareSeries s = mulSeries s s
circleSeries :: Fractional a => [a]
circleSeries = addSeries (squareSeries sineSeries) (squareSeries cosineSeries)
-- SICP, exercise 3.61
invertUnitSeries :: Fractional a => [a] -> [a]
invertUnitSeries (a:as) = x -- a == 1
where x = 1 : map negate (mulSeries as x)
-- SICP, exercise 3.62
invertSeries :: Fractional a => [a] -> [a]
invertSeries aa@(a:as) = map (/a) (invertUnitSeries (map (/a) aa))
divSeries :: Fractional a => [a] -> [a] -> [a]
divSeries aa bb@(b:bs) = mulSeries aa (invertSeries bb)
tangentSeries :: Fractional a => [a]
tangentSeries = divSeries sineSeries cosineSeries
-- extra series
listToSeries :: Fractional a => [a] -> [a]
listToSeries l = l ++ repeat 0
geometricSeries, geometricSeries' :: Fractional a => [a]
geometricSeries = repeat 1
geometricSeries' = invertUnitSeries (listToSeries [1, -1]) -- generating function 1/(1-x)
fibonacciSeries :: Fractional a => [a]
fibonacciSeries = divSeries (listToSeries [0, 1]) (listToSeries [1, -1, -1]) -- generating function x/(1-x-x²)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment