シェル芸とHaskellの対応を考える
Tue Apr 8 17:40:38 JST 2014 (modified: Sun Oct 1 10:50:27 JST 2017)
views: 2682, keywords:コマンド,Haskell,Haskell芸,シェル芸,シェル芸は関数型,頭の中だだ漏らし この記事は最終更新日が7年以上前のものです。
どうも上田です。眠気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風のコマンドがあるとスッキリしたワンライナーが書けそうだなというところ。
まだまだ夜は遠い。