使用 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>
只有我慢慢熟悉 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>