コマンドラインで Haskell のワンライナーっぽいものが使える hawk ってのがあるらしくて、awk に似ているから hawk っていうらしい。

気軽に Haskell の練習できて楽しい。

インストールは

$ cabal install haskell-awk

らしい。

hoge:goro:mogu
goro:mogu:hoge

という入力があって 2列目だけ取り出したーいとかなら

$ echo "hoge:goro:mogu\ngoro:mogu:hoge" | hawk -d: -m '!!2'
mogu
hoge

という感じらしい。-m を使うと行ごとの処理がかけて -d を使うとデリミタを認識してあらかじめリストしておいてくれる。

それ意外にも情報源にできる。

奇数のリストを作って10個とりだしてみる。

$  hawk 'take 10 [1,3..]'
1
3
5
7
9
11
13
15
17
19

もちろん無限リストだって作れる。

$ hawk '[1,3..]' | head -n 10
1
3
5
7
9
11
13
15
17
19

~/.hawk/prelude.hs をいじれば、他のモジュールもインポートできる。

Data.Ix でも追加して遊んでみる。

{-# LANGUAGE ExtendedDefaultRules, OverloadedStrings #-}
import Prelude
import qualified Data.ByteString.Lazy.Char8 as B
import qualified Data.List as L
import Data.Ix
$ hawk 'range ((0,0,0),(2,2,2))' | head -n 20
0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
0 2 0
0 2 1
0 2 2
1 0 0
1 0 1
1 0 2
1 1 0
1 1 1
1 1 2
1 2 0
1 2 1
1 2 2
2 0 0
2 0 1

ひっくくりかえして3つとるとかを愚直にかくと、

$ seq 10 | hawk -a 'take 3 . reverse'
10
9
8

でやりたい順番と逆転してしまうので、 ~/.hawk/prelude.hsimport Control.Arrow 追加しときました。

$ seq 10 | hawk -a 'reverse >>> take 3'
10
9
8

なんとなく楽しい。