使用 Lodash 编写一个函数,该函数 returns 一个函数,它在其中使用一个函数

Compose a function that returns a function, which uses a function inside it, with Lodash

只有我慢慢熟悉 FP,开始使用普通的 Lodash。

我正在尝试创建一个 isCode 函数,它将 return true 用于以下内容:

const code = 'EAI_AGAIN'
const error = {code: 'EAI_AGAIN'}

isCode(code)(error)

目前有效:

const getCode = partial(get, _, 'code')

const isCode = function(string) {
    return function(object) {
        return equal(string, getCode(object))
    }
}

还有这个:

const isCode = string => flow(getCode, partial(equal, string))

但我想知道它会是什么样子 "one level deeper" / "point-free(?)"。


我尝试了各种方法,但均未成功:

const isCode = curry(equal, _, partial(getCode))

const isCode = curry(partial(equal, _), partial(getCode, _))

const isCode = partial(curry, equal, partial(getCode))

大部分都是在黑暗中拍摄的,因为我不知道要搜索的正确术语是什么,我发现 "FP introductions" 中的 none 和这个一样深- 貌似。

我不太确定你为什么要这样做,但代码可能类似于:

function isCode(code){
  return function(error){
    if(code === error.code){
      return true;
    }
    return false;
  }
}
const code = 'EAI_AGAIN';
const error = {code: 'EAI_AGAIN'};
console.log(isCode(code)(error));

方法 _.isEqual() 需要两个值,并且不会调用函数,因此当您柯里化它时,它会将函数与字符串进行比较,并且不会尝试从对象中提取值。

_.flow() 语句足够 pointfree,更易读:

const isCode = string => flow(getCode, partial(equal, string))

另一种选择是部分应用 matchesProperty

const { matchesProperty, partial } = _

const code = 'EAI_AGAIN'
const error = {code: 'EAI_AGAIN'}

const isCode = partial(matchesProperty, 'code')

const result = isCode(code)(error)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

你也应该尝试lodash/fp,因为在 fp 版本中,所有方法都是柯里化的,具有固定的数量,并且顺序正确:

const { matchesProperty } = _

const code = 'EAI_AGAIN'
const error = {code: 'EAI_AGAIN'}

const isCode = matchesProperty('code')

const result = isCode(code)(error)

console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>