関数型ドメインモデリングを読んで、あの本は F# だったけど、C# でも同じことをやってみたくなった。ただ、C# には標準で Result クラスがないので自作しないといけない。F# のコンピューテーション式も C# にはない。ただ、LINQ のクエリ式を使えば同じことができるかも、と思ってライブラリを作成してみた。
「Kekka(結果)」っていう名前。Result クラスとちょっとした拡張メソッドが用意した。使い方としては基本的に Result.Ok やResult.Error で値をラップするだけ。あと、LINQ のクエリ式を使うことで F# と似た書き味で書くことができる。Railway Oriented Programming。
using Kekka; var result1 = from x in Result.Ok<decimal, Exception>(2) from y in Result.Ok<decimal, Exception>(x) from z in Result.Ok<decimal, Exception>(y) select x + y + z; if (result1.TryGetValue(out var value)) { Console.WriteLine($"result1: {value}"); // Output: result1: 6 } var result2 = from x in Result.Ok<decimal, Exception>(2) from y in Result.Error<decimal, Exception>(new Exception("Error!!")) from z in Result.Ok<decimal, Exception>(3) select x + y + z; if (result2.TryGetError(out var error)) { Console.WriteLine($"result2: {error.Message}"); // Output: result2: Error!! }
関数型ドメインモデリングの著者が GitHub に、本で紹介したサンプルのソースコードを公開していたので、それを C# で移植してみた。
自作の Result クラスを使って、サンプルを C# に置き換えることができたので、少なくとも目標としていた Railway Oriented Programming というか、関数型ドメインモデリングを C# で行うための最低限の機能は実装できたかな。