
Hello everyone. I have a problem with a assessment. The problem is with the layout. I cannot understand what is wrong. Here is the code module Main where import IO import System import List import Maybe import Char import Numeric type Word=String type WordCount=Int type WordTup=(word,wordCount) type WordList=[WordTup] main=do args<-getArgs textLines<-getText switchArgs args textLines where switchArgs args textLines |(isMemberOf "-f" args) && (isMemberOf "-i" args) =printFreq(sortWordCount(parseLcLine textLines)) |(isMemberOf "-f" args) =printFreq(sortWordCount (parseLine textLines)) |(isMemberOf "-i" args) =printFreq(sortWordCount (parseLcLine textLines)) |otherwise =printFreq(sortName (parseLine textLines)) getText::IO String getText=do c<-getChar e<-isEOF if (e) then return "" else (do nc<-getText return (:nc)) parseLine::String->Wordlist parseLine line |(line/="")&&(isWantedChar (headline)) =fillWordList w(parseLine newLine) |(line/="")&&(not(isWantedChar (headline))) =parseLine(tail line) isMemberOf::String->[String]->Bool isMemberOf arg args =[]/=[a|a<-args,a==arg] printFreq::WordList->IO() printFreq wl=do sequence (map putWordStat wl) where putWordStat(Word,WordCount)->IO() putWordStat(w,wc) do putStr w putSpc (20 (length w) (length(show wc))) putStr (show wc) putSpc 8 putStr (showFFloat (Just 2) (fromIntegral (wc) * 100.0/fromIntegral (wLength))"") putChar '%' putChar '\n' return() wlLength-countWords wl; putSpc::Int->IO() putSpc n |n>1 do putChar '' putSpc (n-1) return() |otherwise=putChar '' countWords:Wordlist->Int countWords [ ] countWords ((w,wc):wl)=wc+countWords wl sortName::WordList->WordList sortName [ ] = [ ] sortName (wn:ws)=sortName [(w,wc) (w,wc) <-ws,not (isGreater (w,wc)wc)] ++[wn]++sortName[(w,wc)|(w,wc)<-ws, isGreater (w,wc) wn] where isGreater (wl,wcl) (w2,wc2) |ord(head(wl))-ord(head(x2))>0=True |ord(head(wl))-ord(head(x2))<0=False |length wl>l && length w2>l =isGreater(tail(wl),wcl) (tail(w2,wc2) |otherwise = [] where w=parseWord line newline=drop (length w) line parseLcLine::String->WordList parseLcLine line |(line/="") && (isWantedChar (head line))=fillWordList w (parseLcLine newline) |(line/="") && (not (isWantedChar (head line)))=parseLcLine (tail line) |otherwise = [] where w=map toLower (parseWord line) newline=drop (lenfth w) line parseWord::Word->Word parseWord w |(w/="") && (isWantedChar (head w))=(head w): parseWord (tail w)) |otherwise = "" isWantedChar::Char->Bool isWantedChar c | (c=='a'|| c=='b'|| c=='c'|| c=='d'|| c=='e'|| c=='f'|| c=='g'|| c=='h'|| c=='i'|| c=='j'|| c=='k'|| c=='l'|| c=='m'|| c=='n'|| c=='o'|| c=='p'|| c=='q'|| c=='r'|| c=='s'|| c=='t'|| c=='u'|| c=='v'|| c=='w'|| c=='x'|| c=='y'|| c=='z'||c=='A'|| c=='B'|| c=='C'|| c=='D'|| c=='E'|| c=='F'|| c=='G'|| c=='H'|| c=='I'|| c=='J'|| c=='K'|| c=='L'|| c=='M'|| c=='N'|| c=='O'|| c=='P'|| c=='Q'|| c=='R'|| c=='S'|| c=='T'|| c=='U'|| c=='V'|| c=='W'|| c=='X'|| c=='Y'|| c=='Z'|| = True) |otherwise = False fillWordList::Word->WordList->WordList fillWordList w wordlistl |cWord/= [] =cWord++[wordl,wordCountl)|(wordl,wordCountl<-wordListl,wordl/=w] |otherwise = (w,l):wordListl where cWord=[(wordl,(wordCountl-l)) | (wordl,wordCountl)<-wordListl,wordl==w] |length w1>1 && length w2==1=True |otherwise = False sortWordCount::WordList->WordList sortWordCount [] = [] sortWordCount ((wn,wcn):ws=sortWordCount [(w,wc|cw,wc)<-ws,ws<=wvn++ [(wn,wcn)]++sortWordCount [(cw,wc)|(w,wc)<-ws,wcs,wcn]