-- | A demo to show that a tail-recursive function will not increase -- the JavaScript stack. -- -- See the ticket about optimizing tail-recursive functions for future -- work module Tailrecursive where import FFI import Prelude main = do benchmark $ printI (map (\x -> x+1) fibs !! 10) benchmark $ printI (fibs !! 80) benchmark $ printD (sum' 1000000 0) benchmark $ printD (sum' 1000000 0) benchmark $ printD (sum' 1000000 0) benchmark $ printD (sum' 1000000 0) fibs = 0 : 1 : zipWith (+) fibs (tail fibs) benchmark m = do start <- getSeconds m end <- getSeconds printS (show (end-start) ++ "ms") length' :: [a] -> Int length' = go 0 where go acc (_:xs) = go (acc+1) xs go acc [] = acc -- tail recursive sum' 0 acc = acc sum' n acc = let x = acc + n in x `seq` sum' (n - 1) x getSeconds :: Fay Double getSeconds = ffi "new Date()" printD :: Double -> Fay () printD = ffi "console.log(%1)" printI :: Int -> Fay () printI = ffi "console.log(%1)" printS :: String -> Fay () printS = ffi "console.log(%1)"