HaskellWiki

Haskell | Wiki community | Recent changes
Random page | Special pages

 

Not logged in
Log in | Help

Programming performance/JCAB Haskell

< Programming performance

Code

module Main where
 
programmingPerformance file =
    let filteredFile = filter filterLine (lines file)
        filterLine [] = False
        filterLine ('#':_) = False
        filterLine _ = True
        
        closingList = reverse (map extractClosing filteredFile) :: [Double]
        extractClosing line = read ((tokenize line) !! 6)
        tokenize [] = []
        tokenize line = let (token, rest) = getToken line in token : tokenize rest
        getToken []       = ("", [])
        getToken (' ':xs) = ("", xs)
        getToken (x  :xs) = let (token, rest) = getToken xs in (x:token, rest)
        
        result = parseClosingSell 10000.0 [] closingList
        parseClosingSell :: Double -> [(Double, Double)] -> [Double] -> Double
        parseClosingSell cash shares c@(_:y:rest) =
            let (sale, remShares) = foldr maybeSell (0, []) shares
                maybeSell (shClosing, shNum) (accCash, accShares) | (y - shClosing) >= shClosing * 0.06 = (accCash + y * shNum, accShares)
                maybeSell sh                 (accCash, accShares)                                       = (accCash            , sh:accShares)
            in parseClosingBuy (cash + sale) remShares c
        parseClosingSell cash shares [y] =
            let sale = foldr sell 0 shares
                sell (shClosing, shNum) accCash = accCash + y * shNum
            in cash + sale
        parseClosingBuy cash shares (x:y:rest) | (x - y) >= x * 0.03 = parseClosingSell (cash * 0.90) ((y, cash*0.10 / y):shares) (y:rest)
        parseClosingBuy cash shares (x:rest) = parseClosingSell cash shares rest
        
    in result
 
main = do
    file <- readFile "C:\\JCAB\\ProgrammingPerformance\\gspc.txt"
    let result = programmingPerformance file
    putStrLn (show result)

Retrieved from "http://haskell.org/haskellwiki/Programming_performance/JCAB_Haskell"

This page has been accessed 365 times. This page was last modified 06:09, 15 March 2007. Recent content is available under a simple permissive license.