Edited at

LangExtの紹介 - LangExtとは何であって、何でないか

More than 5 years have passed since last update.

昨日、LangExtというライブラリの新しいバージョンをリリースしました。

このライブラリは、C#での関数プログラミングを支援するためのライブラリです。

ブログでは割と長文のエントリを書く傾向にあるので、こっちではLangExtの機能を細切れで紹介していく感じにしようと思います。

最初の記事は、LangExtの紹介のようなものです。


LangExtとは

LangExtは、C#での関数プログラミングを支援するためのライブラリですが、

「関数プログラミング」という言葉に対して感じるものは人によってかなり異なります。

そこで、そのあたりを少しでも明確にしようと思います。


LangExtは言語を拡張するライブラリである

LangExtという名前は、言語(Language)を拡張する(Extend)ことから来ています。

実際に言語を拡張するわけではないのですが、

C#の言語仕様を駆使してそれなりに分かりやすく色々なことが出来るようになっています。

提供する主な機能は、


  • シーケンスに対する操作

  • Option/Result(Either)

  • タプルに対する操作

  • 関数(Funcデリゲート)に対する操作

です。


LangExtは実用的なライブラリである

標準クエリ演算子を捨てたり、IEnumerableを捨てたりしてはいますが、LangExtは実用できることを目指して作っています。

ここでいう「実用」は、「仕事でも使える」ということです。

外界との関連を絶って、完全に自分の中で完結するようなライブラリもあっていいと思います(Funcの引数の数を1つまでに絞ってみたり)。

ですが、それでは他のコードと連携を取らなければいけなくなった時に、いちいちワンクッションかませたり、どこかで無理が出たりします。

そういう事態を避けるため、LangExtは多少泥臭い方法(T4による自動生成とか)を使ってでも、標準ライブラリが対応している範囲までは頑張ります。

その結果失う表現力は確かにあります。しかし、LangExtの目的はコードで美しい世界を表現したいわけではありません。むしろ泥臭くても実用を目指したライブラリなのです。


LangExtはモナドライブラリではない

LangExtはモナドを提供することを主目的としたライブラリではありません。

もちろん、LangExtもいくつかのモナドを提供しますが、その提供範囲は限定的です。

具体的には、


  • リストモナド

  • Optionモナド

  • Error/Exceptionモナド

を提供しています。

今後増える可能性はありますが、それが主目的のライブラリではないため、その方面での期待はしないでください。


LangExtは型クラスライブラリではない

LangExtは型クラスを提供することを目的としたライブラリではありません。

いくつかの設計上の方針により、そもそも型クラスを提供しないという方向に進んでいます。

これについてはいずれ詳しく説明する予定です。


LangExtはLINQを拡張するライブラリではない

LINQはクエリ式と標準クエリ演算子からなります。

しかし、LangExtではその片方である標準クエリ演算子を捨てています。

そのため、LangExtはむしろLINQを否定するライブラリとも言えます。


次回

次は、実際にLangExtの中身の紹介に入っていきます。

LangExtの中身の紹介は、シーケンスの概要から始めます。