C# と F# がどれだけうまく連携できるかを理解しようとしています。F# for Fun & Profit ブログから、識別された共用体型を返す基本的な検証を実行するコードをいくつか引用しました。
type Result<'TSuccess,'TFailure> =
| Success of 'TSuccess
| Failure of 'TFailure
type Request = {name:string; email:string}
let TestValidate input =
if input.name = "" then Failure "Name must not be blank"
else Success input
これを C# で使用しようとすると、成功と失敗 (失敗は文字列、成功は再び要求) に対して値にアクセスするために見つけることができる唯一の方法は、大きな厄介なキャストを使用することです (これは多くの入力であり、私が期待する実際の型を入力する必要があります)。推測またはメタデータで利用可能):
var req = new DannyTest.Request("Danny", "fsfs");
var res = FSharpLib.DannyTest.TestValidate(req);
if (res.IsSuccess)
{
Console.WriteLine("Success");
var result = ((DannyTest.Result<DannyTest.Request, string>.Success)res).Item;
// Result is the Request (as returned for Success)
Console.WriteLine(result.email);
Console.WriteLine(result.name);
}
if (res.IsFailure)
{
Console.WriteLine("Failure");
var result = ((DannyTest.Result<DannyTest.Request, string>.Failure)res).Item;
// Result is a string (as returned for Failure)
Console.WriteLine(result);
}
これを行うより良い方法はありますか?手動でキャストする必要がある場合でも (実行時エラーの可能性があります)、少なくとも型 ( ) へのアクセスを短縮したいと考えていますDannyTest.Result<DannyTest.Request, string>.Failure
。より良い方法はありますか?