ロンドンに拠点を持つ Paul Louth 氏が作成した C# 向けのオープンソースライブラリである Lang Ext は"関数言語の世界を C# へ持ち込む"ことを狙いとし、言語自身を拡張しているように見せることに挑戦する一方で、ヘルパー関数と型を提供している。
Paul 氏は「Lang Ext は C# を拡張することより、いくつかの領域に関数型言語のスタイルを持ち込み言語を改善しようとしている」と述べている。
C# が向かう方向性が見えたということは素晴らしく、関数型とオブジェクト指向の中道派としての位置づけに更に向かうことが明らかだ。しかし、いくつかの主要な点は消え去らない。例として、null は言語からは消えないだろうし、変数が標準では変更可能な点も同様だ。このため、私は常に一番の泣き所となるこれらバグのクラスをどうやって除去できるかを考えている。
以下は現在リリースされている Lang Ext の機能リストの一部だ。
- タプル向けの改良構文:例、
var ab = tuple("a","b");
Option
を介した null 参照の修正- ラムダ式のワンライナー:例、
var add = fun( (int x, int y) => x + y );
- 実際の型としての Void:純粋関数型をサポートするため、常に値を返すものとする(
void
はファーストクラスではない) - イミュータブルな List と Dictionary の利便性の高い構文は、もう一方であるミュータブルに対して利用を助長させることが目的であり、List のパターンマッチも提供する。
C# の拡張に挑戦する代わりに F# や Haskell といった言語を利用しない理由について、Paul 氏は「C# から既存の言語に常に切り替えられるわけではないので、C# に関数型言語のスタイルを取り入れる方が合理的な手法だ」と説明している。
過去数年間、Haskell を学び、F# で開発したコアプロジェクトの周辺プロジェクトの作成を開始した。F# は非常によくできており、言語での主要な方針がバグのクラスを消すことが可能な点をが素晴らしい。一方で、C# に戻った場合でのそれらのバグは非常に苛立たしい。
Lang Ext の欠点としてイディオムに非対応なことがあげられる一方、Paul 氏はイディオムに従うことの重要性について「C# のイディオムは Java や C# 1.0 から引き継がれたものが多い」として疑問視しており、「C# はリリース毎に関数型言語の様になっている言語だ」と述べている。