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

Tue Apr 8 17:40:38 JST 2014 (modified: Sun Oct 1 10:50:27 JST 2017)
views: 2220, keywords:コマンド,Haskell,Haskell芸,シェル芸,シェル芸は関数型,頭の中だだ漏らし この記事は最終更新日が6年以上前のものです。

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

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

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

データ

  • n行のテキストデータ = Haskellのリスト(要素数n)に相当。 ```bash ###以下の「list」が等価### $ cat list a b c Prelude> let list = ["a","b","c"] Prelude> list ["a","b","c"] ```
  • n行m個のテキストデータ = m要素のリストがn個入っているリスト。 ```bash ###以下の「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風のコマンドがあるとスッキリしたワンライナーが書けそうだなというところ。

まだまだ夜は遠い。

ノート   このエントリーをはてなブックマークに追加 
 

prev:第10回シェル芸勉強会無事やり遂げました。 next:本日はこっちに書いた ---ささやかな自分プロジェクトの立ち上げ方。| techLIONブログ

やり散らかし一覧

記事いろいろ