はじめに

Control.Arrow モジュールに (^>>)(>>^) という演算子が定義されています。

ちょっとだけ面白かったので紹介しようと思います。

準備

例として、文字列を全て大文字に変換する関数を考えてみましょう。

素朴に書けばこんな感じでしょうか。

この関数は以下のように期待通りに動きます。

*Main> toAllUpper "B|g0on"
"B|G0ON"

ではここで、同じように Text バージョンを作りたいと思います。何も考えずに pack と unpack を使えばすぐ定義できますね。

この関数も同様にちゃんと動きます。

(^>>) と (>>^) を無理矢理使ってみる

先程定義した toAllUpperText 関数は (^>>)(>>^) を使って、以下のように書き直すことができます。(Control.Arrow をインポートする必要があります。)

左から右バージョン

右から左バージョン

関数合成 (.) を単純に置き換えただけです・・・。

この演算子の何が面白いかと言うと、入力出力をそれぞれ変換できるんですね!

先程の例は Arrow aa を関数型 (->) として具体化したものになります。

引数の順番を逆にすれば関数合成の型と同じですね。

まとめ

  • 現実世界で Arrow をバリバリ使っているコードをみかけることは (僕は) 全く無いです。(Hakyll は過去に Arrow ベースで定義されていたようですが、Monad ベースに切り替わりました)

たぶん使うことは無いですが、パズルみたいで楽しい。

以上です。