[Haskell-cafe] Re: wanted: haskell one-liners (in the perl sense of one-liners)

Thomas Hartman tphyahoo at gmail.com
Tue Mar 20 08:05:45 EDT 2007

Just thought I'd add another potentially helpful bit to this oneliner
/ shell scripting thread. Though to be fair, this perhaps strains the
definition of "one" in "one liner".

This takes a long file containing mostly numerical data, filters out
the numerical data, and sorts it numerically. (Not the same thing as
sorting alphabetically, which is what you get by default, or using the
unix sort utility). Maybe there's some flag to make unix sort util act
like this? Enh, who cares, now we have haskell. :)

Thanks to Thunder, Quicksilver, and whoever else it was on #haskell
who helped me out with this.


thartman at linodewhyou:~/learning/haskell/UnixTools>cat sortNumeric.sh | head -n10
cat out_select_char_length_csv.out | ghc -e '
interact $
. map show

-- more efficient than -- reverse . take 10 . reverse
. ( \s -> drop (length s - 10 ) s )

. Data.List.sort -- maybe not necessary?
. map ( read :: String -> Integer )
. Data.Set.toAscList . Data.Set.fromList -- more efficient than prelude nub
. filter ( all Data.Char.isDigit ) . lines'

2007/3/7, Chris Kuklewicz <haskell at list.mightyreason.com>:
> Thomas Hartman wrote:
> > Just noticed a comment in
> >
> > http://www.serpentine.com/blog/2007/02/27/a-haskell-regular-expression-tutorial/
> >
> >
> > which says there's no perl-like regex replace in the library, and links to
> >
> > http://hpaste.org/697
> >
> > which is an attempt at providing one.
> >
> > Not sure if this is useful or not.
> >
> Any given replacement routine is less than 10 lines of code and will do exactly
> what you need.
> A general replacement library has to contend with several things:
>   1a) What syntax/semantics?
>   1b) How do you supply a specification?  Must it be the same type as the
> regular expression or the data?
>   1c) How do you report errors?
>   2) Which regex-* backends to support?
>   3) What types to work on? [Char], Seq Char, ByteString, Lazy ByteString.
>   4a) If the backend/type supports lazy matching then does the replacing?
>   4b) What if the backend/type does not support lazy match or strictness is desired?
>   5) If there is laziness then can it handle infinite streams of input?
>   6) Is anyone smart enough to design this API without actual users?
> Note that some approaches allow for much more efficiency than others.  Taking a
> normal ByteString and performing replacement to create a Lazy ByteString makes
> sense, but is a bit of wrinkle.
> But as you pointed to on http://hpaste.org/697 any given example of a
> replacement routine will be very small, and easy to build on top of the regex-* API.

More information about the Haskell-Cafe mailing list