Right, but if you use Prelude.interact, as in my example, you don't have to 
worry about the EOF checking yourself - it's all handled for you.  And if you 
use a functional style, your code will be simpler and more testable - otherwise 
you might as well just use an imperative language.

Here's a slightly better version (uses splitAt):

maxLineLength :: Int
maxLineLength = 72

wrapLine :: String -> [String]
wrapLine "" = []
wrapLine line 
  | length line <= maxLineLength    = [line]
  | otherwise                                        = let (line, rest) = 
splitAt maxLineLength line in
                                                                 line : 
wrapLine rest

main :: IO ()
main = interact $ unlines . concatMap wrapLine . lines

On Saturday Aug 14, 2010, at 12:38 AM, michael rice wrote:

> Hi Bill,
> 
> Each quote of the input is on a single line. I want to unwrap lines greater 
> than 72 characters, i.e., break them into several lines each <= 72 
> characters, but I don't want to break up words. and I want to retain the 
> blank lines. So, my output is correct except for the error message.
> 
> Michael 
> 
> ============ My input data ============
> However mean your life is, meet it and live it: do not shun it and call it 
> hard names. Cultivate poverty like a garden herb, like sage. Do not trouble 
> yourself much to get new things, whether clothes or friends. Things do not 
> change, we change. Sell your clothes and keep your thoughts. God will see 
> that you do want society.
> 
> Men have become the tools of their tools.
> 
> I know of no more encouraging fact than the unquestioned ability of a man to 
> elevate his life by conscious endeavor.
> 
> I once had a sparrow alight upon my shoulder for a moment, while I was hoeing 
> in a village garden, and I felt that I was more distinguished by that 
> circumstance that I should have been by any epaulet I could have worn.
> 
> -Thoreau
> ============ My output ============
> unwrap: <stdin>: hGetLine: end of file  <<<< here's my eof message
> However mean your life is, meet it and live it: do not shun it and call 
> it hard names. Cultivate poverty like a garden herb, like sage. Do not 
> trouble yourself much to get new things, whether clothes or friends. 
> Things do not change, we change. Sell your clothes and keep your 
> thoughts. God will see that you do want society.
> 
> Men have become the tools of their tools.
> 
> I know of no more encouraging fact than the unquestioned ability of a 
> man to elevate his life by conscious endeavor.
> 
> I once had a sparrow alight upon my shoulder for a moment, while I was 
> hoeing in a village garden, and I felt that I was more distinguished by 
> that circumstance that I should have been by any epaulet I could have 
> worn.
> 
> -Thoreau
> ============ Your output ==========
> However mean your life is, meet it and live it: do not shun it and call 
> it hard names. Cultivate poverty like a garden herb, like sage. Do not t
> rouble yourself much to get new things, whether clothes or friends. Thin
> gs do not change, we change. Sell your clothes and keep your thoughts. G
> od will see that you do want society.
> Men have become the tools of their tools.
> I know of no more encouraging fact than the unquestioned ability of a ma
> n to elevate his life by conscious endeavor.
> I once had a sparrow alight upon my shoulder for a moment, while I was h
> oeing in a village garden, and I felt that I was more distinguished by t
> hat circumstance that I should have been by any epaulet I could have wor
> n.
> -Thoreau
> ===================================
> 
> 
> --- On Fri, 8/13/10, Bill Atkins <watk...@alum.rpi.edu> wrote:
> 
> From: Bill Atkins <watk...@alum.rpi.edu>
> Subject: Re: [Haskell-cafe] Unwrapping long lines in text files
> To: "michael rice" <nowg...@yahoo.com>
> Cc: haskell-cafe@haskell.org
> Date: Friday, August 13, 2010, 11:13 PM
> 
> Not sure if I understood what you're trying to do, but development will be 
> easier if you minimize your IO, e.g. :
> 
> maxLineLength :: Int
> maxLineLength = 72
> 
> wrapLine :: String -> [String]
> wrapLine "" = []
> wrapLine line 
>   | length line <= maxLineLength    = [line]
>   | otherwise                                        = take maxLineLength 
> line : wrapLine (drop maxLineLength line)
> 
> main :: IO ()
> main = interact $ unlines . concatMap wrapLine . lines
> 
> Now wrapLine is pure and you can use it more easily using GHCi.  Removing 
> dependencies on IO usually makes your problem easier to test and understand 
> and your code simpler.
> 
> In your example, the EOF probably happens on the call to getLine after input 
> has run out.  By using Prelude.interact, we can ignore details like that and 
> rely on already-written functions.
> 
> HTH,
> Bill
> 
> On Friday Aug 13, 2010, at 9:38 PM, michael rice wrote:
> 
> > The program below takes a text file and unwraps all lines to 72 columns, 
> > but I'm getting an end of file message at the top of my output.
> > 
> > How do I lose the EOF?
> > 
> > Michael
> > 
> > 
> > ====== unwrap.hs ======
> > 
> > main = do
> >     line <- getLine
> >     if null line
> >         then do
> >                putStrLn ""
> >                main
> >         else
> >            do
> >              printList (words line) 1
> >              main
> > 
> > 
> > printList :: [String] -> Int -> IO ()
> > printList [] _ = do putStrLn ""
> > printList (w:[]) k = do 
> >                        if k+(length w) <= 72
> >                          then do
> >                            putStrLn w
> >                          else do
> >                            putStrLn ""
> >                            putStrLn w
> > printList r@(w:ws) k = do 
> >                          if k+(length w) <= 72
> >                            then do
> >                              putStr w
> >                              putStr " "
> >                              printList ws (k+(length w)+1)
> >                            else do
> >                              putStrLn ""
> >                              printList r 1
> > 
> > 
> > 
> > _______________________________________________
> > Haskell-Cafe mailing list
> > Haskell-Cafe@haskell.org
> > http://www.haskell.org/mailman/listinfo/haskell-cafe
> 
> 

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to