Код: Выделить всё
using LanguageExt;
using static LanguageExt.Prelude;
Код: Выделить всё
static Either Sqrt(double d) =>
d >= 0.0
? Math.Sqrt(d)
: "Error: Negative number";
static Either Double(double d) =>
d > 10.0
? "Error: Too big to double"
: 2 * d;
Я связываю их вместе как следует...
Код: Выделить всё
public static string Calc(double d) =>
(from res1 in Sqrt(d)
from res2 in Double(res1)
select res2)
.Match(res => $"Result: {res}",
err => err);
Теперь предположим (что более реалистично) вспомогательные функции были асинхронными, то мне нужно было бы изменить свою конечную точку, чтобы она выглядела так...
Код: Выделить всё
public static async Task Calc(double d) =>
await (from res1 in Sqrt(d).ToAsync()
from res2 in Double(res1).ToAsync()
select res2)
.Match(res => $"Result: {res}",
err => err);
Кстати: я взял стиль кодирования, приведенный выше. прочитав часть кода Пола Лаута в выпусках LanguageExt. Если есть лучший способ сделать это, пожалуйста, предложите его. Я не претендую на звание какого-либо эксперта в этом вопросе.
Однако теперь в случае ошибок я хочу их регистрировать, отправлять электронное письмо и т. д., поэтому вторая лямбда метода Match должна быть асинхронной. Чтобы избежать ошибки компилятора, мне также нужно сначала выполнить async, а затем дождаться результата...
Код: Выделить всё
public static async Task CalcAsync2(double d) =>
await await (from res1 in Sqrt(d).ToAsync()
from res2 in Double(res1).ToAsync()
select res2)
.Match(async res => $"Result: {res}",
async err => {
// Log the error, send an email, etc (async);
return err;
});
Кто-нибудь может прокомментировать здесь? Я хочу иметь возможность регистрировать ошибку, если какой-либо из вспомогательных методов возвращал Left, но предпочел бы, чтобы вся работа async (и действительно, как можно большая часть работы) выполнялась в последовательность операторов from, в результате чего лямбды в Math выполняют не более чем возвращаемые значения.
Подробнее здесь: https://stackoverflow.com/questions/786 ... a-is-async