昨日、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の中身の紹介は、シーケンスの概要から始めます。