【发布时间】:2017-12-26 19:00:30
【问题描述】:
想象一下你的妻子让你去买一些 Campion 花。因为它是一种稀有的花,你不确定你是否能在隔壁的花店找到它。所以你必须检查镇上的每一家花店并要求他们露营。但事实上有些花店有公用电话号码,你可以打电话问他们。其中一些有网站,其中一些你必须走进去。
因此,您从最简单的解决方案开始您的探索。关键是您以独特的方式检查每家花店,例如您与他们交谈的方式或到达那个人的路径。如果我们从代码上讲,这些是几个功能;每个商店一个功能。
因此,在编程世界中,您必须为 10 种可能的解决方案编写 10 种不同的查询函数。下一步是逐个尝试列表中所有可能的解决方案,一旦您得到肯定的答案/回复/返回,您将停止任务并提出答案。
我认为这是一个例行程序,最有可能像过滤器、映射和缩减器,我相信我是对的。
那么有这样的东西怎么样?
在二郎中:
-export([struggle/2]).
struggle(Input, Solutions) ->
struggle(Input, Solutions, false).
struggle(_, [], false) ->
false;
struggle(Input, [Solution|OtherSolutions], false) ->
struggle(Input, OtherSolutions, Solution(Input));
struggle(_, _, Answer) ->
Answer.
或在 javascript 中:
function struggle(input, solutions)
{
let strgl = (input, solutions, acc) => {
if (solutions.length === 0 && acc === undefined) return undefined;
if (acc === undefined) return strgl(input, solutions.slice(1), solutions[0](input));
return acc;
};
return strgl(input, solutions, undefined);
}
你不认为它是一个内置的高阶函数就足够通用了吗?
PS:代码运行良好,无需修复。问题是,为什么不是内置函数?
【问题讨论】:
-
有点像
Promise.race? -
我不知道 Erlang,但是你在找
Array.prototype.find吗? -
solutions.map(f => f(input)).find(ans => ans !== undefined); -
@4castle, no
Array.prototype.find和Array.prototype.filter仅在所有数据都在一个位置或至少共享一个数据结构(将它们连接为具有一个数据源)时才有效。我说的是一种情况,您需要不同的函数体,其中一个可能是ans => ans !== undefined,但不是全部。 -
@T4rk1n 不知何故但不完全是。因为
Promise.race同时执行所有可能的解决方案并返回第一个resolve它从那些称为承诺的异步中获得。这里我们需要一个顺序/优先级。
标签: javascript functional-programming erlang