Я пытаюсь понять, насколько хорошо С# и F # могут играть вместе. Я взял код из F # для блога Fun and 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
При попытке использовать это в С#; единственный способ найти доступ к значениям против успеха и неудачи (неудача - это строка, успех - запрос снова) - с большими неприятными отбрасываниями (что очень много печатает и требует ввода фактических типов, которые я ожидал бы выводятся или доступны в метаданных):
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
). Есть ли лучший способ?