シェル芸とHaskellの対応を考える

Pocket
LINEで送る

どうも上田です。眠気1000%でお送り致します。

かねてからシェル芸は関数型と主張しているので、主張の中身を一つ一つ具体的にしようとしております。眠いので。

まずは、ワンライナーでよく出てくるコマンドとHaskellの関数の対応表を作ってみようと思います。眠いので。

データ

  • n行のテキストデータ = Haskellのリスト(要素数n)に相当。
    ###以下の「list」が等価###
    $ cat list
    a
    b
    c
    Prelude> let list = ["a","b","c"]
    Prelude> list
    ["a","b","c"]
    
  • n行m個のテキストデータ = m要素のリストがn個入っているリスト。
    ###以下の「mat」が等価###
    uedambp:~ ueda$ cat mat
    a b
    c d
    Prelude> let mat = [["a","b"],["c","d"]]
    Prelude> mat
    [["a","b"],["c","d"]]
    

操作や演算子の対応表

上のようにデータ構造の対応をつけたとき、
Haskellとシェルワンライナーで対応するものは次のようになる。

操作・演算子 Haskell コマンド
コマンド、関数の連結 バインド演算子 パイプ
文を単語に分ける words tr ‘ ‘ ‘¥n’(Tukubaiのtarr)
リストを文にまとめる unwords xargsあるいはtr ‘¥n’ ‘ ‘(Tukubaiのyarr)
charまで分解 String型では既に分解されている gsed ‘s/./&¥n/g’ , grep -o .
先頭のいくつかを取得 take <個数> head -n <個数>
先頭のいくつかを除去 drop <個数> tail -n +<個数+1>
各要素の操作(計算) map <ラムダ式> awk ‘{計算処理}’
各要素の操作 map <関数> xargs <コマンド>
フィルタリング filter <関数> grep <正規表現>, awk <パターン>
リストの反転 reverse tac, tail -r
足し算 foldr (+) 0 awk ‘{a+=$1}END{print a}’(Tukubaiのsm2, sm5)
ソート Data.List.sort sort
ある行まで抽出 takeWhile sed -n ‘1,/正規表現/p’等
ある行以降を抽出 dropWhile sed -n ‘/正規表現/,$p’等

・・・くっ・・・眠い・・・続きはwebでまた今度。なんか気づいたら@ryuichiuedaまで・・・。謝辞つきで拝借して表に追加します。

一応知見を書いておく

こうやって見てみると、Haskell風のコマンドがあるとスッキリしたワンライナーが書けそうだなというところ。

まだまだ夜は遠い。

Pocket
LINEで送る