[Haskell-cafe] Re: Software Tools in Haskell

apfelmus apfelmus at quantentunnel.de
Wed Dec 12 15:43:55 EST 2007

Tommy M McGuire wrote:
> (Plus, interact is scary. :-D )

You have a scary feeling for a moment, then it passes. ;)

> Gwern Branwen wrote:
>> I... I want to provide a one-liner for 'detab', but it looks
>> impressively monstrous and I'm not sure I understand it.
> On the other hand, I'm not looking for one-liners; I really want clarity 
> as opposed to cleverness.

   tabwidth = 4

      -- tabstop !! (col-1) == there is a tabstop at column  col
      -- This is an infinite list, so no need to limit the line width
   tabstops  = map (\col -> col `mod` tabwidth == 1) [1..]

      -- calculate spaces needed to fill to the next tabstop in advance
   tabspaces = snd $ mapAccumR addspace [] tabstops
   addspace cs isstop = let cs'=' ':cs in (if isstop then [] else cs',cs')

   main = interact $ unlines . map detabLine . lines
      detabLine = concat $ zipWith replace tabspaces
      replace cs '\t' = cs     -- replace with adequate number of spaces
      replace _  char = [char] -- pass through

How about that?


More information about the Haskell-Cafe mailing list