fallibleというパッケージをリリースしました

Posted by Nobutada MATSUBARA(@matsubara0507) on July 18, 2019

タイトルの通り、fallibleというパッケージを紹介します。

ちなみに、fallibleHaskell-jp Slack:

と質問したところ、該当するようなパッケージは無さそうだったので作ったという経緯があります。 その際に助言をくれた fumieval氏のコードをほとんど引用した形になったので、Haskell-jp Blogに紹介記事を載せることにしました(僕は普段、自分のブログに自作したパッケージを書いています)

Link to
here
fallibleパッケージ

Haskellでアプリケーションを記述してると次のようなコードを書くことがありますよね?

Slackのようなチャットツールをイメージしてください。 該当の名前(targetName)を持つユーザーを与えると、そのユーザーが参加しているチャンネルの一覧を表示するというような振る舞いです。 こう段々になってしまうのは気持ち悪いですよね。 fallibleの目的はこの段々を次のように平坦にすることです(where などは割愛):

Link to
here
やってること

というか、もともとのアイデアは下記のブログです:

これを一般化(Maybe a 固有ではなく Either e a でも使う)できないかなぁというのがもともとの発想です。

Link to
here
基本演算子

次の4つの演算子を利用します:

ただし、内部実装的には Maybe aEither e aFallible 型クラスで一般化されています:

これらを継続モナドと組み合わせることでIOと失敗系モナド(Maybe aEither e a)を、モナドトランスフォーマーなしにDo記法で書くことができます!

Link to
here
サンプルコード

疑似的なIOで良いならfallibleリポジトリのexampleディレクトリにあります(上述の例はそれです)

実際の利用例であれば、最近自作したmatsubara0507/mixlogueというHaskellアプリケーションで多用しています(ココとかココとか)。 ちなみに、mixlogueは特定のSlackの分報チャンネル(times_hoge)の発言を収集するというだけのツールです。

Link to
here
使い方

READMEを参照してください。

現状Hackageにはあげてないので、stackCabalGitHubリポジトリから参照する方法を利用してください。

Link to
here
おしまい

fumieval氏のコードをほとんど引用するだけになったので自分でリリースするか迷ったんですけど、リリースしてくれというのも丸投げがひどいので自分でリリースしました。 まぁこういう結果が生まれるのもOSSコミュニティの醍醐味ということで。 fumieval氏、いつもアドバイスをくれてありがとう!

(もちろん他のHaskell-jpの皆さんも!)