想象一下,你的妻子邀请你去买一些Campion花。因为它是一种稀有的花,你不确定你能不能在隔壁的花店找到它。所以你得去镇上的每一家花店找他们要花店。但事实是,一些花店有公共电话号码,你可以在电话中询问他们。他们中的一些人有网站,而有些人你必须走进去。
所以你可以从最简单的解决方案开始你的探索。重点是你用一种独特的方式去检查每一家花店,比如你和他们说话的方式,或者你去找那个人的路。如果我们按代码来讲,这些是几个函数;每个商店一个函数。
因此,在编程领域,您必须为10种可能的解决方案编写10个不同的查询函数。下一步是逐一尝试列表中的每一个可能的解决方案,一旦你得到一个肯定的回答/回复/返回,你就会停止探索并给出答案。
我认为这是一个例程,就像过滤器、映射和缩减一样,我相信我是足够正确的。
那么,像这样的东西怎么样?
在erlang中:
-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:代码运行良好,不需要修复它。问题是,为什么它不是一个内置函数呢?
发布于 2017-07-21 12:43:52
确切的问题是什么?
strugle(Input, Solutions) ->
lists:any(fun(X) -> X(Input) end, Solutions).这是Erlang的要点。或者,如果您希望返回第一个非False值。
strugle(Input, Solutions) ->
any_non_false(fun(X) -> X(Input) end, Solutions).
any_non_false(F, L) ->
try lists:any(fun(X) ->
case F(X) of
false -> false;
Y -> throw({return, Y})
end
end, L)
catch {return, X} -> X end.发布于 2017-07-21 06:31:20
这听起来非常像Array.prototype.find,除了期望的返回值是find看到的第一个真值,而不是生成真值的元素。
您可以使用Array.prototype.reduce来完成此操作:
function struggle(input, solutions) {
return solutions.reduce((ans, solution) =>
ans !== undefined ? ans : solution(input)
, undefined);
}如果必须这样写,应该是这样的:
function struggle(input, solutions) {
for (const solution of solutions) {
const ans = solution(input);
if (ans !== undefined) {
return ans;
}
}
return undefined;
}这听起来不像是一个内置函数,因为它不够通用。这里有两个步骤:(1)映射解决方案,(2)测试值是否可接受。内置的JavaScript函数往往是非常通用的。更具体的函数更适合于实用程序库。
发布于 2017-07-21 06:43:17
在Scheme中,您可以这样编写代码:
// some from SRFI-1, also called ormap in some dialects
(define (struggle input solutions)
(some (lambda (f) (f input)) solutions))似乎JavaScript得到了Array.prototype.some,而Erlang得到了lists:any/2,但两者都有缺陷,它们不返回真值,而只返回true,所以你只能知道它是否找到了答案,而不知道答案是什么。
在JS中,很容易创建一个与方案相同的some版本。我对Erlang不太确定。
https://stackoverflow.com/questions/45225573
复制相似问题