[Haskell-beginners] Re: Need help to edit the Haskell script in Winhugs and documentation.

Benjamin L.Russell DekuDekuplex at Yahoo.com
Mon Mar 30 04:52:34 EDT 2009


Could you please describe your question more specifically?

-- Benjamin L. Russell

On Sat, 28 Mar 2009 16:48:47 +0000, RAJESH DALSANIYA
<r4rose4raj4u at gmail.com> wrote:

>* *
>
>*Both sections relate to the case study:         Index for a document of
>text.*
>
>* *
>
>*SECTION  A: *
>
>* *
>
>*Given the attached Haskell code which produces an index of words, make the
>following alterations by modifying existing functions and including new
>functions where necessary ? parts 1) to 5):*
>
>* *
>
>*1)                  **Where a word occurs N times on the same line, ensure
>that the line number occurs n times in the index entry for that word.
>*
>
>* *
>
>*2)                  **Allow words to be hyphenated and treat a hyphenated
>word as a single word.  However, for those words which are split over two
>lines, treat a split word as a single word without the hyphen.             *
>
>* *
>
>*3)                  **Treat a capitalised word (one or more capitals) as
>being different from the word in all lower case (but they should still be
>sorted alphabetically) ? unless it is at the start of a sentence with only
>the initial letter capitalised.  A sentence is terminated by a ‘.’, ‘?’ or
>‘!’. *
>
>* *
>
>*4)                  **Make the output more readable in the form of an index
>table in columns with appropriate spacing and without brackets.  *
>
>* *
>
>*5)                  **Include a user-friendly menu, so that the user can
>choose input/output file names or default files, and choose to rerun or
>exit.    *
>
>* *
>
>*Parts 1) to 5) may be developed in any order.  *
>
>* *
>
>* *
>
>*SECTION B:*
>
>* *
>
>*6)                  **For your version of function, makeIndex (only), show
>how an alternative ordering of the composed functions would provide a more
>efficient execution of makeIndex.  Justify your answer.       *
>
>* *
>
>*7)                  **For the parts 1) to 5) above that you have attempted,
>discuss the use you have made of a) higher-order functions, b) list
>comprehension, c) monadic input/output, d) functional composition, and/or e)
>partial parameterisation (or Curried functions).  Include an evaluation of
>how useful your use of these concepts has been.
>*
>
>* *
>
>*
>*
>*
>*
>
>*import Prelude*
>
>* *
>
>*type Doc  =  String*
>
>*type Line =  String*
>
>*type Word =  String *
>
>* *
>
>*makeIndex  ::  Doc  ->  [ ([Int], Word) ]*
>
>* *
>
>*makeIndex*
>
>* =   shorten . --   [([Int], Word)]    -> [([Int], Word)]*
>
>*     amalgamate .-- [([Int], Word)]    -> [([Int], Word)]*
>
>*     makeLists .   --   [(Int, Word)] -> [([Int], Word)]*
>
>*     sortLs .  --   [(Int, Word)] -> [(Int, Word)]*
>
>*     allNumWords .--    [(Int, Line)] -> [(Int, Word)]*
>
>*     numLines .    --   [Line]        -> [(Int, Line)]*
>
>*     splitUp  --   Doc           -> [Line]*
>
>* *
>
>*splitUp :: Doc -> [Line]*
>
>* *
>
>*splitUp [] = []*
>
>*splitUp  text*
>
>* = takeWhile (/='\n') text : --   first line*
>
>*   (splitUp .           --   splitup other lines*
>
>*    dropWhile (==’\n’) .     --   delete 1st newline(s)*
>
>*    dropWhile (/='\n')) text --   other lines*
>
>* *
>
>*numLines :: [Line] -> [(Int, Line)]*
>
>* *
>
>*numLines lines               --   list of pairs of *
>
>* = zip [1 .. length lines] lines  --   line no. & line*
>
>* *
>
>*--   for each line*
>
>*--   a)   split into words*
>
>*--   b)   attach line no. to each word*
>
>* *
>
>*splitWords :: Line -> [Word]      --   a)*
>
>* *
>
>*splitWords [] = []*
>
>*splitWords  line *
>
>* = takeWhile isLetter line :      --   first word in line*
>
>*     (splitWords .           --   split other words*
>
>*       dropWhile (not.isLetter) .      --   delete separators*
>
>*       dropWhile isLetter) line   --   other words*
>
>*   where*
>
>*   isLetter ch*
>
>*     = (‘a’<=ch) && (ch<=’z’)*
>
>*       || (‘A’<=ch) && (ch<=’Z’)*
>
>* *
>
>*numWords :: (Int, Line) -> [(Int, Word)]   --   b)*
>
>* *
>
>*numWords (number, line)*
>
>* = map addLineNum ( splitWords line)  --   all line pairs*
>
>*   where*
>
>*   addLineNum word = (number, word)        --   a pair*
>
>* *
>
>*allNumWords :: [(Int, Line)] -> [(Int, Word)]*
>
>* *
>
>*allNumWords = concat . map numWords        --   doc pairs *
>
>* *
>
>*sortLs :: [(Int, Word)] -> [(Int, Word)]*
>
>* *
>
>*sortLs  [ ]  =  [ ]*
>
>*sortLs (a:x)*
>
>* = sortLs [b | b <- x, compare b a]   --   sort 1st half*
>
>*   ++  [a]  ++               --   1st in middle*
>
>*   sortLs [b | b <- x, compare a b]   --   sort 2nd half*
>
>*    where*
>
>*    compare (n1, w1) (n2, w2)*
>
>*     = (w1 < w2)                  --   1st word less*
>
>*        || (w1 == w2 && n1 < n2)  --   check no. *
>
>* *
>
>*makeLists :: [(Int, Word)] -> [([Int], Word)]*
>
>* *
>
>*makeLists *
>
>* = map mk                    --  all pairs*
>
>*   where mk (num, word) = ([num], word)*
>
>*                             --  list of single no.*
>
>* *
>
>*amalgamate :: [([Int], Word)] -> [([Int], Word)]*
>
>* *
>
>*amalgamate [ ] = [ ]*
>
>*amalgamate [a] = [a]*
>
>*amalgamate ((n1, w1) : (n2, w2) : rest)--  pairs of pairs*
>
>* | w1 /= w2        = (n1, w1) : amalgamate ((n2, w2) : rest)*
>
>* | otherwise = amalgamate ((n1 ++ n2, w1) : rest)*
>
>*     --   if words are same grow list of numbers*
>
>* *
>
>*shorten :: [([Int], Word)] -> [([Int], Word)]*
>
>* *
>
>*shorten*
>
>* = filter long                   --   keep pairs >4*
>
>*   where*
>
>*     long (num, word) = length word > 4  -- check word >4*
>
>* *
-- 
Benjamin L. Russell  /   DekuDekuplex at Yahoo dot com
http://dekudekuplex.wordpress.com/
Translator/Interpreter / Mobile:  +011 81 80-3603-6725
"Furuike ya, kawazu tobikomu mizu no oto." 
-- Matsuo Basho^ 



More information about the Beginners mailing list