【发布时间】:2017-01-15 05:41:50
【问题描述】:
今天我看到一段代码,我在想它的意义。所以我做了一个小例子,你可以看到它是如何工作的。 据我所知,它应该是嵌套功能,大量使用 Lambda-Caculus,就像在函数式语言中使用一样。 因为我发现这不太好理解(从文件跳转到文件)我只想知道你们中是否有人对这样的事情有类似的经验。
示例函数一
public void DoSomethingA(int inputInt, Action<int?, Exception> result)
{
try
{
int? retVal = inputInt;
result(retVal, null);
}
catch (Exception e)
{
result(null, e);
}
}
示例函数二
static void DoSomethingB(int? baseInt, Action<Exception> result)
{
try
{
result(null);
}
catch (Exception e)
{
result(e);
}
}
两者的调用示例。
public int? CalculateSomething(int input)
{
int? result;
DoSomethingA(input, (resultInt, aException) =>
{
if (aException != null)
{
return;
}
DoSomethingB(resultInt, bException =>
{
if (bException != null)
{
return;
}
result = resultInt;
});
});
return null;
}
也许有趣的是,正常的“主要”函数会有某种承诺。所以它注册了函数并等待结束并得到结果。
【问题讨论】:
-
显然,您的代码无法编译...在函数 1 中,您调用
result并使用null作为第一个参数,而它需要一个int。在最后一个代码块中,result并不总是被初始化。 -
这里的实际问题是什么?
-
事实。修复。谢谢!
-
一个好的函数式实现应该有单独的函数来表示成功和失败。您不必以这种方式将空值传递给成功函数,也不必处理
result函数中的失败。此外,null到底是什么意思?什么失败了?文件丢失了吗?是否使用了无效值? -
另请注意,Tasks 允许您使用
ContinueWith将结果传递给另一个函数。async/await让这个更干净,所以你不需要回调
标签: c# functional-programming design-principles