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

Thomas Hartman tphyahoo at gmail.com
Sun Mar 4 05:11:52 EST 2007


To answer my original question, here's a few ways to accomplish what I
wanted with haskell

Perl is still a lot faster than ghc -e, but I guess if you wanted
speed you could compile first.

********************************************************************

thartman at linodewhyou:~/learning/haskell/UnixTools$ ls -l
total 16
-rw-r--r-- 1 thartman thartman 2726 Dec 20 07:56 UnixTools.hs
-rw-r--r-- 1 thartman thartman   82 Jan  7 07:18 echo.hs
-rwxr--r-- 1 thartman thartman  790 Mar  4 05:02 oneliners.sh
-rwxr--r-- 1 thartman thartman  646 Mar  4 04:18 oneliners.sh~

thartman at linodewhyou:~/learning/haskell/UnixTools$ ./oneliners.sh
haskell, ghc -e pipe
16

real    0m1.652s
user    0m0.600s
sys     0m0.030s
**********
haskell, hmap pipe
16

real    0m1.549s
user    0m0.410s
sys     0m0.200s
**********
haskell, two pipes
16

real    0m2.153s
user    0m0.900s
sys     0m0.370s
**********
perl, two pipes
16

real    0m0.185s
user    0m0.010s
sys     0m0.100s

thartman at linodewhyou:~/learning/haskell/UnixTools$


thartman at linodewhyou:~/learning/haskell/UnixTools$ cat oneliners.sh
hmap (){ ghc -e "interact ($*)";  }
hmapl (){ hmap  "unlines.($*).lines" ; }
hmapw (){ hmapl "map (unwords.($*).words)" ; }

function filesizes () {
  find -maxdepth 1 -type f | xargs du
}

echo haskell, ghc -e pipe
time filesizes | ghc -e 'interact $ (++"\n") . show . sum . map ( (
read :: String -> Integer ) . head . words ) . lines '
echo "**********"

echo haskell, hmap pipe
time filesizes | hmap '(++"\n") . show . sum . map ( ( read :: String
-> Integer ) . head . words ) . lines'
echo "**********"

echo haskell, two pipes
time filesizes | hmapl "map ( head . words )" | hmap '(++"\n") . show
. sum . map ( read :: String -> Integer ) . lines'
echo "**********"

echo perl, two pipes
time filesizes | perl -ane 'print "$F[0]\n"' | perl -e '$sum += $_
while <>; print "$sum\n"'


2007/3/2, Thomas Hartman <tphyahoo at gmail.com>:
> Okay, I am aware of
>
> http://haskell.org/haskellwiki/Simple_unix_tools
>
> which gives some implementation of simple unix utilities in haskell.
>
> But I couldn't figure out how to use them directly from the shell, and
> of course that's what most readers will probably wnat.
>
> Or let me put it another way.
>
> Is there a way to do
>
>   find -maxdepth 1 -type f | xargs du | perl -ane 'print "\$F[0]\n"' |
> perl -e '$sum += $_ while <>; print "$sum\n"'
>
> as a shell command that idiomatically uses haskell?
>
> For non-perlers, that sums up the disk usage of all files in the
> current directory, skipping subdirs.
>
> print "\$F[0]\n
>
> looks at the first (space delimited) collumn of output.
>
> perl -e '$sum += $_ while <>; print "$sum\n"'
>
> , which is I guess the meat of the program, sums up all the numbers
> spewed out of the first column, so in the end you get a total.
>
> So, anyone out there want to establish a haskell one liner tradition?
>
> :)
>
> thomas.
>


More information about the Haskell-Cafe mailing list