Dear staff,
    I am currently working on an assignment with requires us to write in 
Haskell. I am having trouble with "pipeline". The required textbook called, 
"The Craft of Functional Programming" 2nd Edition.   There is a pipeline 
example, which I find it useful in my assignment, but for some reason, there 
may be a typo in the pipeline syntax, which is ">.>". Coz it doesn't compile 
@_@

I have attached a file of the example, I found from the book. There is a 
website where I could download the entire book. It's got the same stuff as 
in my textbook. Please help me, coz i've tried even Unix's pipeline syntax  
which is obviously wrong... I'm not desperate, please reply, thank you very 
much.

Sincerely,
Jack

This is the output of the compilor...
/*********************************************************************/
Haskell 98 mode: Restart with command line option -98 to enable

Reading file "C:\PROGRAM FILES\HUGS98\lib\Prelude.hs":
Parsing........................................................
Dependency analysis............................................
Type checking..................................................
Compiling......................................................
Reading file "E:\433\CHAPTE~1.LHS":
Parsing........................................................
Dependency analysis
ERROR "E:\433\CHAPTE~1.LHS" (line 22): Undefined variable ">.>"
Prelude>
/**********************************************************************/


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

        Haskell: The Craft of Functional Programming
        Simon Thompson
        (c) Addison-Wesley, 1999.

        Chapter 10

Example: creating an index
^^^^^^^^^^^^^^^^^^^^^^^^^^

The basic type symonyms

>       type Doc  = String
>       type Line = String
>       type Word = String

The type of the top-level function
The top-level definition

>       makeIndex :: Doc -> [ ([Int],Word) ]
>       makeIndex
>         = lines       >.>     --   Doc            -> [Line]
>           numLines    >.>     --   [Line]         -> [(Int,Line)] 
>           allNumWords >.>     --   [(Int,Line)]   -> [(Int,Word)]
>           sortLs      >.>     --   [(Int,Word)]   -> [(Int,Word)]
>           makeLists   >.>     --   [(Int,Word)]   -> [([Int],Word)]
>           amalgamate  >.>     --   [([Int],Word)] -> [([Int],Word)]
>           shorten             --   [([Int],Word)] -> [([Int],Word)]

Implementing the component functions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
Attach a number to each line.

>       numLines :: [Line] -> [ ( Int , Line ) ]
>       numLines linels
>         = zip [1 .. length linels] linels

Associate each word with a line number

>       numWords :: ( Int , Line ) -> [ ( Int , Word ) ]

>       numWords (number , line)
>         = [ (number , word) | word <- Chapter7.splitWords line ]

The definition uses splitWords from Chapter 7, modified to use a different
version of whitespace. For this to take effect, need to make the modification
in the Chapter7.lhs file.

>       whitespace :: String
>       whitespace = " \n\t;:.,\'\"!?()-"

Apply numWords to each integer,line pair.

>       allNumWords :: [ ( Int , Line ) ] -> [ ( Int , Word ) ]
>       allNumWords = concat . map numWords

The list must next be
sorted by word order, and lists of lines on which a word appears be built.
The ordering relation on pairs of numbers and 
words is given by

>       orderPair :: ( Int , Word ) -> ( Int , Word ) -> Bool
>       orderPair ( n1 , w1 ) ( n2 , w2 )
>         = w1 < w2 || ( w1 == w2 && n1 < n2 )

Sorting the list using the orderPair ordering on pairs.

>       sortLs :: [ ( Int , Word ) ] -> [ ( Int , Word ) ]

>       sortLs []     = []
>       sortLs (p:ps)
>         = sortLs smaller ++ [p] ++ sortLs larger
>           where
>           smaller = [ q | q<-ps , orderPair q p ]
>           larger  = [ q | q<-ps , orderPair p q ]

The entries for the same word need to be accumulated together.
First each entry is converted to having a list of line numbers associated with
it, thus

>       makeLists ::  [ (Int,Word) ] -> [ ([Int],Word) ]
>       makeLists 
>         = map mklis 
>           where
>           mklis ( n , st ) = ( [n] , st )

After this, the lists associated with the same words are amalgamated.

>       amalgamate :: [ ([Int],Word) ] -> [ ([Int],Word) ]

>       amalgamate [] = []
>       amalgamate [p] = [p]
>       amalgamate ((l1,w1):(l2,w2):rest)
>         | w1 /= w2    = (l1,w1) : amalgamate ((l2,w2):rest)
>         | otherwise   = amalgamate ((l1++l2,w1):rest)

Remove all the short words.

>       shorten :: [([Int],Word)] -> [([Int],Word)]

>       shorten 
>         = filter sizer 
>           where
>           sizer (nl,wd) = length wd > 3


Verification and general functions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

All the functions used in this section have been defined earlier.

Reply via email to