python toolz curry & pymonad Either

toolz のpipe, curryを利用した関数型的な処理をこれまでいくつか紹介いたしました。
これより、私の業務で使ってみた範囲でモナド、特にEitherモナドを紹介し、AWSのEC2情報を取得するコードを実例に挙げてみたいと思います。
私自身、モナドを初めて使ってみたという程度の経験ですので、多数の間違いがあるかもしれません。ご了承ください。

まず、モナドについは、googleで”モナド”と検索すると、いくつかの説明サイトへのリンクが表示されるかと思います。
(私は、モナドを箱で表現されているサイト等でその雰囲気を把握することができました。)
入門的な説明はこれらの有用なサイトをご覧いただきたいと思います。

pythonでモナドを実装されているライブラリ pymonad を紹介いたします。
導入方法は、リンク先を参考いただければと思います。

この中のEitherを利用例を紹介いたします。

まず、Eitherの説明です。具体的にはEitherを継承しているRight|Leftクラスの説明です。

ある関数fが、以下のように定義されているとします。

ここで、some_method_f は、何かしらの値を返します。
これと同様な関数gがあるとします。ここでg中の、Right中の処理をsome_method_gとします。

f, g関数を、続けて処理させる時に、monadのbind (pymonadでは >> 演算子)が利用できます。
bindによって、f(a) の結果 Right(some_method_f(a))を引数に 関数g をコールします。このとき、Right内の値を取り出す処理を行います
よって、f(a) >> g の結果は、エラーがない場合には、 Right(some_method_g(some_method_f(a))) となります。

ここで、 エラーがない場合にはと記述しましたのは、 エラーの場合には、別の処理がなされます。

f(a) >> gにおいて、f中のsome_method_f(a)が例外を発生させたとき、f(a) の処理結果はLeft(e)になります。
これを gとbindした場合、 関数gへの適用前の値の取り出しやg中のsome_method_g呼び出し等を 全く行わず このLeft(e)がスルーされて、f(a) >> gの結果は、Left(e)となります。

関数が、受け取った値をRight|Leftに格納して返す型式であれば、このbindの連携はいくつでも継続できます。

これを使いやすくした、toolzを利用したコードを記述してみました。

このライブラリを利用して、例えば、ec2上のインスタンスIDを取得するコードは以下のように書くことができます。

Right|Leftオブジェクトを後段に渡し、そこで処理され、次の行に渡していくということを繰り返し。
ある行で何かしら例外発生する状況(たとえばインデックス指定エラー)等あれば、その処理以降はなされず、結果には例外オブジェクトが値に入ってきます。

以上をまとめます。まずモナドを利用する利点として、

  • メソッドチェーンによって、一般的には記述量が削減されます。

また、pymonad::Eitherを利用した時の利点として

  • 各処理において例外処理を書かなくてよい。
  • 例外発生したところから、すべて処理がスルーされます。

モナドとpymonad::Eitherを利用したAWS処理例を紹介させていただきました。

“python toolz curry & pymonad Either” への1件の返信

コメントは受け付けていません。