Date Sorting Round Three

Michael Ruth meruth@hotmail.com
Thu, 14 Mar 2002 18:30:05 -0600


long set of code here, I think I figured out what you all were telling me. 
Compose small functions then compose bigger functions from smaller
functions and so on...

The problem I am having is I have an (IO String) where I need a (String) and 
it reports it as such:

ERROR "C:\Documents and Settings\drunkenmike\My 
Documents\Programming\Csci4501\H
askell\datesort.hs":41 - Type error in application
*** Expression     : separateIntoLines (getInput x)
*** Term           : getInput x
*** Type           : IO String
*** Does not match : [Char]

I am gonna mark line 41 with a * at the beginning of the line. I have been 
looking high and low for the answer to IOString -> String.... all I think I 
need to do (I think anyways)

By the way, thanks to everyone for their help.

import IO



---
-- Control Flow
---

datesort :: IO()
datesort = do {
putStr   "Enter a filename: ";
theFile <- getLine;
sortAndOutput (readInAndGetReady theFile);
}


--
-- Composite functions
--	1) Read in & Get ready to sort
--	2) sort & output
--
--

readInAndGetReady :: String -> [String]
*readInAndGetReady x =
   fixDates (makeSortableDates (linesToDates (separateIntoLines (getInput 
x))))

sortAndOutput :: [String] -> IO()
sortAndOutput x =
   writeTheFile (getOutput (makePrintableDates (qsort x)))




--
-- Make the date printable. Printable means a string consisting of
-- dates in the form dd mm yyyy (more or less undoes the make sortable f x)
--

makePrintableDates :: [String] -> [String]
makePrintableDates x = map makePrintableDate x

--
-- Make the date printable. Printable means a string consisting of
-- dates in the form dd mm yyyy (more or less undoes the make sortable f x)
--

makePrintableDate :: String -> String
makePrintableDate x = unwords (reverse (words x))

--
-- Make all the dates sortable. Sortable means a string consisting of
-- dates in the form yyyy mm dd
--

makeSortableDates :: [[String]] -> [String]
makeSortableDates x = map makeSortableDate x

--
-- Make the date sortable. Sortable means a string consisting of
-- dates in the form yyyy mm dd
--

makeSortableDate :: [String] -> String
makeSortableDate x = unwords (reverse x)

--
-- Get the input from the given file
--

getInput :: String -> IO String
getInput myfile
  = readFile myfile

--
-- Seperate the input file into an list of Strings
--

separateIntoLines :: String -> [String]
separateIntoLines str = lines str

--
-- Transform all the lines into dates
--

linesToDates :: [String] -> [[String]]
linesToDates x = map lineToDate x

--
-- Transform the lines into dates
--

lineToDate :: String -> [String]
lineToDate x = words x


--
-- Transform the dates into lines
--

getOutput :: [String] -> String
getOutput x = unlines x

--
-- Fix all the dates so that they are in the form 0x if x < 10
--

fixDates:: [String] -> [String]
fixDates x = map fixPrefixes x

--
-- Fix the dates so that they are in the form 0x if x < 10
--

fixPrefixes :: String -> String
fixPrefixes p
   | p == "1" 	= "01"
   | p == "2"	= "02"
   | p == "3" 	= "03"
   | p == "4"	= "04"
   | p == "5" 	= "05"
   | p == "6"	= "06"
   | p == "7" 	= "07"
   | p == "8"	= "08"
   | p == "9" 	= "09"
   | otherwise	= p

--
-- Quicksort the List of strings
--

qsort :: [String] -> [String]
qsort []     = []
qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
		 where
		   elts_lt_x   = [y | y <- xs, y < x]
		   elts_greq_x = [y | y <- xs, y >= x]

--
-- Write the ouput string to a file
--

writeTheFile :: String -> IO()
writeTheFile x = writeFile "output.txt" x







_________________________________________________________________
Chat with friends online, try MSN Messenger: http://messenger.msn.com