广告
返回顶部
首页 > 资讯 > 精选 >JavaScript中的函数式编程怎么应用
  • 216
分享到

JavaScript中的函数式编程怎么应用

2023-06-27 11:06:15 216人浏览 安东尼
摘要

本文小编为大家详细介绍“javascript中的函数式编程怎么应用”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript中的函数式编程怎么应用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。JavaS

本文小编为大家详细介绍“javascript中的函数式编程怎么应用”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript中的函数式编程怎么应用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

JavaScript中的函数式编程

即使函数式编程可以极大地改善应用程序的代码,但其原理在开始时可能会有些挑战。由于详细解释所有这些都将花费大量时间,因此我们决定使用两个实际的代码示例来介绍这些概念。

1.Maybe Monad

在第一个示例中,我们找到一种避免验证变量是否为Null的方法。假设在我们的应用程序中,我们可以找到具有以下格式的用户:

const someUser = { name: 'some_name', email: 'some@email.com', settings: {  language: 'sp' }};

有一个功能,可以以用户设置的语言返回欢迎消息。

const allGreetings = { 'en': '嗨', 'sp': '你好', 'fr': '欢迎你'};const getGreetingForUser = (user) => { //将要执行}

来看一个遵循命令式模型的“getGreetingForUser”函数的实现:

const getGreetingForUser = (user) => { if (!user) {   return allGreetings.en; } if (user.settings && user.settings.language) {   if (allGreetings[user.settings.language]) {     return allGreetings[user.settings.language]   } else {     return allGreetings.en;   } } else {   return allGreetings.en; }};console.log(getGreetingForUser(someUser));

如上面所看到的,必须检查用户是否已经存在,是否已设置语言,以及是否已准备好欢迎消息。如果出现问题,我们将以默认语言返回一条消息。

现在,让我们看一下相同的函数,但是这次我们将在其实现中使用函数式编程:

const getGreetingForUser = (user) => {  return RamdaFantasy.Maybe(user)    .map(Ramda.path(['settings', 'language']))    .chain(maybeGreeting);};const maybeGreeting = Ramda.curry((greetingsList, userLanguage) => {  return RamdaFantasy.Maybe(greetingsList[userLanguage]);})(allGreetings);console.log(getGreetingForUser(someUser).getOrElse(allGreetings.en));

为了处理可能为null或未定义的情况,我们将使用Maybe Monad。这使我们可以在对象周围创建包装器,并为空对象分配默认行为。

让我们比较两种解决方案:

//代替验证用户是否为空if (!user) {  return allGreetings.en;}//我们将用:RamdaFantasy.Maybe(user) //我们将用户添加到包装器中
//代替: if (user.settings && user.settings.language) {   if (allGreetings[user.settings.language]) {//我们将用: <userMaybe>.map(Ramda.path(['settings', 'language'])) //如果存在数据,映射将会用它
//不是在else中返回默认值: return indexURLs['en'];.getOrElse(allGreetings。EN)// 指定的默认值。

2 Either Monad

当我们知道存在空错误时的默认行为时,Maybe Monad非常有用。

但是,如果我们有一个引发错误的函数,或者我们将各种引发错误的函数链接在一起,并且我们想知道哪个发生了故障,则可以改用Either Monad

现在,让我们假设我们要计算产品的价格,同时考虑增值税和可能的折扣。我们已经有了以下代码:

const withTaxes = (tax, price) => { if (!_.isNumber(price)) { return new Error("Price is not numeric"); } return price + (tax * price);};const withDiscount = (dis, price) => {   if (!_.isNumber(price)) {     return new Error("Price is not numeric");   }   if (price < 5)     return new Error("Discounts not available for low-priced items");   }   return price - (price * dis);5}; const isError = (e) => e && e.name === 'Error';const calculatePrice(price, tax, discount) => { //将要执行}

让我们来看一个遵循命令式模型的“calculatePrice”函数的实现:

const calculatePrice = (price, tax, discount) => {  const priceWithTaxes = withTaxes(tax, price);  if (isError(priceWithTaxes)) {    return console.log('Error: ' + priceWithTaxes.message);  }  const priceWithTaxesAndDiscount = withDiscount(discount, priceWithTaxes);  if (isError(priceWithTaxesAndDiscount)) {    return console.log('Error: ' + priceWithTaxesAndDiscount.message);  }  console.log('Total Price: ' + priceWithTaxesAndDiscount);}//我们计算出价值25的产品(含21%的增值税和10%的折扣)的最终价格。 calculatePrice(25, 0.21, 0.10)

现在,让我们了解如何使用Either Monad重写此函数。

都有两个构造函数,LeftRight。我们要实现的是将异常存储到Left构造函数,并将正常结果(快乐路径)存储到Right构造函数。

首先,将更改已经存在的withTaxeswithDiscount函数,以便在出现错误时它们返回Left,在一切正常的情况下返回Right

const withTaxes = Ramda.curry((tax, price) => {  if (!_.isNumber(price)) {    return RamdaFantasy.Either.Left(new Error("Price is not numeric"));  }  return RamdaFantasy.Either.Right(price + (tax * price)); });const withDiscount = Ramda.curry((dis, price) => {  if (!_.isNumber(price)) {    return RamdaFantasy.Either.Left(new Error("Price is not numeric"));   }  if (price < 5) {     return RamdaFantasy.Either.Left(new Error("Discounts not available for low-priced items"));   }   return RamdaFantasy.Either.Right(price - (price * dis)); });

然后,我们为Right案例创建一个函数(显示价格),为Left案例创建另一个函数(显示错误),然后使用它们创建Either Monad

const showPrice = (total) => { console.log('Price: ' + total) }; const showError = (error) => { console.log('Error: ' + error.message); }; const eitherErrorOrPrice = RamdaFantasy.Either.either(showError, showPrice);

最后,只需要执行Monad来计算最终价格:

//计算出价值25的产品(含21%的增值税和10%的折扣)的最终价格。 eitherErrorOrPrice(   RamdaFantasy.Either.Right(25)     .chain(withTaxes(0.21))     .chain(withDiscount(0.1)))

读到这里,这篇“JavaScript中的函数式编程怎么应用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: JavaScript中的函数式编程怎么应用

本文链接: https://www.lsjlt.com/news/309944.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript中的函数式编程怎么应用
    本文小编为大家详细介绍“JavaScript中的函数式编程怎么应用”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript中的函数式编程怎么应用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。JavaS...
    99+
    2023-06-27
  • Java函数式编程怎么应用
    今天小编给大家分享一下Java函数式编程怎么应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Java 根据常用需求场景的用...
    99+
    2023-07-04
  • javascript函数式编程的用法
    本篇内容介绍了“javascript函数式编程的用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明函数式编程是一种编程范式,是一种软件开...
    99+
    2023-06-20
  • 什么是JavaScript函数式编程
    这篇文章主要讲解了“什么是JavaScript函数式编程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么是JavaScript函数式编程”吧!JavaSc...
    99+
    2022-10-19
  • 用JavaScript实现函数式编程
    这篇文章主要讲解了“用JavaScript实现函数式编程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“用JavaScript实现函数式编程”吧!函数式编程语...
    99+
    2022-10-19
  • Java中的函数式编程怎么使用
    本文小编为大家详细介绍“Java中的函数式编程怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中的函数式编程怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。概述背景函数式编程的理论基础是阿隆...
    99+
    2023-07-05
  • javascript用函数式编程的原因是什么
    这篇“javascript用函数式编程的原因是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看...
    99+
    2022-10-19
  • Java8函数式编程之收集器怎么应用
    这篇文章主要介绍“Java8函数式编程之收集器怎么应用”,在日常操作中,相信很多人在Java8函数式编程之收集器怎么应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java8函数式编程之收集器怎么应用”的疑...
    99+
    2023-07-06
  • JavaScript中的函数式编程实例分析
    这篇文章主要介绍“JavaScript中的函数式编程实例分析”,在日常操作中,相信很多人在JavaScript中的函数式编程实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript中的函数式...
    99+
    2023-07-05
  • JavaScript函数中的参数怎么应用
    这篇文章主要介绍了JavaScript函数中的参数怎么应用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript函数中的参数怎么应用文章都会有所收获,下面我们一起来...
    99+
    2022-10-19
  • JavaScript 中的函数式编程:为什么它比常规编程更好?
    JavaScript 是一种脚本语言,它被广泛应用于 Web 开发中。在 JavaScript 中,函数式编程已经成为了一种流行的编程风格。而这种编程风格相较于常规编程风格,具有更高的可维护性、可重用性和可测试性。在本文中,我们将探讨 J...
    99+
    2023-11-05
    编程算法 函数 javascript
  • Java中怎么支持函数式编程
    这篇文章将为大家详细讲解有关Java中怎么支持函数式编程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java一直是面向对象的语言,一切皆对象,如果想要调用一个函数,函数必须属于一个类或对象...
    99+
    2023-06-16
  • JavaScript函数式编程的示例分析
    这篇文章给大家分享的是有关JavaScript函数式编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。看过许多关于函数式编程的讲解,但是其中大部分是停留在理论层面,还有...
    99+
    2022-10-19
  • JavaScript中的函数式编程函数和组合以及柯里化是怎样的
    JavaScript中的函数式编程函数和组合以及柯里化是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。面向对象编程和函数式编程是两种非常...
    99+
    2022-10-19
  • Java中的函数式编程
    目录1、Lambda2、函数接口2.1 函数描述符3、Java函数接口3.1 Predicate3.2 Consumer 3.3 Function3.4 Supplier3.5 Pr...
    99+
    2022-11-12
  • 一文带你理解JavaScript中的函数式编程
    目录分析理解纯函数相同的输入参数,总会有相同的输出在执行过程中不会产生语义上可观察的 副作用纯函数 的作用不确定性的危害确定性的好处如何对待副作用总结我理解的 函数式编程 是一种 编...
    99+
    2023-02-20
    JavaScript函数式编程 JS函数式编程 JavaScript编程
  • 函数式编程在 Python 日志处理中的应用?
    函数式编程在 Python 日志处理中的应用 随着大数据时代的到来,日志数据的处理成为了一项重要的任务。Python 作为一种高效、易学的编程语言,被广泛应用于日志处理领域。在日志处理过程中,函数式编程成为了一种越来越流行的编程范式,它可以...
    99+
    2023-07-22
    日志 分布式 函数
  • Java 8中怎么实现函数式编程
    这期内容当中小编将会给大家带来有关Java 8中怎么实现函数式编程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。我被 Stack Overflow 上网友“mip”提的一个有趣的问题给难住了。该问题是:1...
    99+
    2023-06-17
  • 怎么在Java中实现函数式编程
    本篇文章为大家展示了怎么在Java中实现函数式编程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实现了...
    99+
    2023-06-14
  • Java中怎么实现Lambda函数式编程
    Java中怎么实现Lambda函数式编程,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。背景java 8 Lambda函数式编程,像阿里、腾讯这样的大互联网公司早就已经使用的技术...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作