【发布时间】:2021-10-28 15:20:45
【问题描述】:
我正在尝试使用 Ramda 练习函数组合,但想知道它是否过于矫枉过正,需要一些建议。
给定下面的对象
const articles = [
{
title: 'Everything Sucks',
url: 'http://do.wn/sucks.html',
author: {
name: 'Debbie Downer',
email: 'debbie@do.wn'
}
},
{
title: 'If You Please',
url: 'http://www.geocities.com/milq',
author: {
name: 'Caspar Milquetoast',
email: 'hello@me.com'
}
}
];
创建一个布尔函数来判断给定的人是否写过任何文章。
示例函数调用
isAuthor('New Guy', articles) // should return false
isAuthor('Debbie Downer', articles) // should return true
我的解决方案
首先我创建一个函数来获取作者姓名,如下所示
const get = _.curry(function(x, obj) { return obj[x]; });
const names = _.map(_.compose(get('name'), get('author'))); // ['Debbie Downer', 'Caspar Milquetoast']
现在我已经准备好使用names 函数,我将尝试构造isAuthor 函数,下面是我的两个尝试
尝试 1:没有作曲
const isAuthor = function(name, articles) {
return _.contains(name, names(articles))
};
尝试 2 作曲
const isAuthor = function(name, articles) {
return _.compose(
_.contains(name), names
)(articles);
}
这两种尝试都取得了正确的结果,这个问题只是从函数式编程的角度提出的,因为我对这个领域完全陌生,想知道哪种尝试比另一种更有利,希望这个问题不会因为基于意见而被关闭,我真诚地认为这不是基于意见,而是在 FP 世界中寻求工业实践。
除了我所做的两次尝试之外,还可以随意提供任何替代方案,谢谢!
【问题讨论】:
-
看起来你的
get函数是 Ramda 的prop函数。 -
函数式编程是关于函数做一件没有副作用的事情,不管你的函数有多复杂。因此,如果您使用多个抽象并不重要。只要您的功能有唯一目的。任何范式都鼓励简单,所以如果你能用最少的层数做同样的事情而不会失去可读性,那么你就是可靠的。
标签: javascript functional-programming ramda.js