首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个名为struggle的高阶函数怎么样?

一个名为struggle的高阶函数怎么样?
EN

Stack Overflow用户
提问于 2017-07-21 05:33:48
回答 3查看 110关注 0票数 2

想象一下,你的妻子邀请你去买一些Campion花。因为它是一种稀有的花,你不确定你能不能在隔壁的花店找到它。所以你得去镇上的每一家花店找他们要花店。但事实是,一些花店有公共电话号码,你可以在电话中询问他们。他们中的一些人有网站,而有些人你必须走进去。

所以你可以从最简单的解决方案开始你的探索。重点是你用一种独特的方式去检查每一家花店,比如你和他们说话的方式,或者你去找那个人的路。如果我们按代码来讲,这些是几个函数;每个商店一个函数。

因此,在编程领域,您必须为10种可能的解决方案编写10个不同的查询函数。下一步是逐一尝试列表中的每一个可能的解决方案,一旦你得到一个肯定的回答/回复/返回,你就会停止探索并给出答案。

我认为这是一个例程,就像过滤器、映射和缩减一样,我相信我是足够正确的。

那么,像这样的东西怎么样?

在erlang中:

代码语言:javascript
复制
-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中:

代码语言: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:代码运行良好,不需要修复它。问题是,为什么它不是一个内置函数呢?

EN

回答 3

Stack Overflow用户

发布于 2017-07-21 12:43:52

确切的问题是什么?

代码语言:javascript
复制
strugle(Input, Solutions) ->
  lists:any(fun(X) -> X(Input) end, Solutions).

这是Erlang的要点。或者,如果您希望返回第一个非False值。

代码语言:javascript
复制
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.
票数 4
EN

Stack Overflow用户

发布于 2017-07-21 06:31:20

这听起来非常像Array.prototype.find,除了期望的返回值是find看到的第一个真值,而不是生成真值的元素。

您可以使用Array.prototype.reduce来完成此操作:

代码语言:javascript
复制
function struggle(input, solutions) {
  return solutions.reduce((ans, solution) =>
    ans !== undefined ? ans : solution(input)
  , undefined);
}

如果必须这样写,应该是这样的:

代码语言:javascript
复制
function struggle(input, solutions) {
  for (const solution of solutions) {
    const ans = solution(input);
    if (ans !== undefined) {
      return ans;
    }
  }
  return undefined;
}

这听起来不像是一个内置函数,因为它不够通用。这里有两个步骤:(1)映射解决方案,(2)测试值是否可接受。内置的JavaScript函数往往是非常通用的。更具体的函数更适合于实用程序库。

票数 1
EN

Stack Overflow用户

发布于 2017-07-21 06:43:17

在Scheme中,您可以这样编写代码:

代码语言:javascript
复制
// 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不太确定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45225573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档