返回顶部
首页 > 资讯 > 精选 >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://lsjlt.com/news/309944.html(转载时请注明来源链接)

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

猜你喜欢
  • JavaScript中的函数式编程怎么应用
    本文小编为大家详细介绍“JavaScript中的函数式编程怎么应用”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript中的函数式编程怎么应用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。JavaS...
    99+
    2023-06-27
  • Java函数式编程怎么应用
    今天小编给大家分享一下Java函数式编程怎么应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Java 根据常用需求场景的用...
    99+
    2023-07-04
  • javascript函数式编程的用法
    本篇内容介绍了“javascript函数式编程的用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明函数式编程是一种编程范式,是一种软件开...
    99+
    2023-06-20
  • golang函数的函数式编程应用
    在 go 中,函数式编程通过 lambda 表达式、高阶函数和函数组合实现。lambda 表达式允许定义匿名函数,高阶函数接受函数作为输入或返回值,函数组合可以组合多个函数创建新函数。实...
    99+
    2024-04-28
    golang 函数式编程 字符串数组
  • 用JavaScript实现函数式编程
    这篇文章主要讲解了“用JavaScript实现函数式编程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“用JavaScript实现函数式编程”吧!函数式编程语...
    99+
    2024-04-02
  • 什么是JavaScript函数式编程
    这篇文章主要讲解了“什么是JavaScript函数式编程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么是JavaScript函数式编程”吧!JavaSc...
    99+
    2024-04-02
  • Java中的函数式编程怎么使用
    本文小编为大家详细介绍“Java中的函数式编程怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中的函数式编程怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。概述背景函数式编程的理论基础是阿隆...
    99+
    2023-07-05
  • javascript用函数式编程的原因是什么
    这篇“javascript用函数式编程的原因是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看...
    99+
    2024-04-02
  • JavaScript中的函数式编程实例分析
    这篇文章主要介绍“JavaScript中的函数式编程实例分析”,在日常操作中,相信很多人在JavaScript中的函数式编程实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript中的函数式...
    99+
    2023-07-05
  • JavaScript函数中的参数怎么应用
    这篇文章主要介绍了JavaScript函数中的参数怎么应用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript函数中的参数怎么应用文章都会有所收获,下面我们一起来...
    99+
    2024-04-02
  • javascript函数式编程基础
    目录一、引言二、什么是函数式编程三、纯函数(函数式编程的基石,无副作用的函数)四、函数柯里化五、函数组合六、声明式和命令式代码七、Point Free八、示例应用九、总结 一、引言...
    99+
    2024-04-02
  • Golang函数式编程在数据处理中的应用
    在 go 中利用函数式编程处理数据的好处:不可变性:防止意外修改输入数据,提高代码可靠性。纯函数:输出仅取决于输入,无副作用,便于测试和推理。一等函数:函数可作为参数或返回值,增强代码灵...
    99+
    2024-04-13
    golang 函数式编程 c# 代码可读性
  • Java8函数式编程之收集器怎么应用
    这篇文章主要介绍“Java8函数式编程之收集器怎么应用”,在日常操作中,相信很多人在Java8函数式编程之收集器怎么应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java8函数式编程之收集器怎么应用”的疑...
    99+
    2023-07-06
  • Golang函数式编程在Web开发中的应用
    函数式编程在 go web 开发中提供了以下优势:可读性、可维护性、可测试性,由于避免可变状态和副作用;并发性,使得代码线程安全;代码重用,提升开发效率。实战案例中,lambda 函数用...
    99+
    2024-04-14
    函数式编程 web开发 golang
  • Golang函数式编程在分布式系统中的应用
    函数式编程在分布式系统中的应用包括:高阶函数:可创建可重用组件和简化代码。不可变性:防止并发问题和数据竞争。纯函数:易于测试和使用。通过结合 map、filter 等函数,可以实现并行且...
    99+
    2024-04-14
    golang 函数式编程
  • JavaScript 中的函数式编程:为什么它比常规编程更好?
    JavaScript 是一种脚本语言,它被广泛应用于 Web 开发中。在 JavaScript 中,函数式编程已经成为了一种流行的编程风格。而这种编程风格相较于常规编程风格,具有更高的可维护性、可重用性和可测试性。在本文中,我们将探讨 J...
    99+
    2023-11-05
    编程算法 函数 javascript
  • 响应式编程在 PHP、JavaScript 和 NumPy 中的应用
    响应式编程(Reactive Programming)是一种编程范式,它强调数据流的流动和变化。在响应式编程中,我们可以定义数据流并对其进行操作,同时响应其变化。响应式编程可以应用于多种编程语言,包括 PHP、JavaScript 和 N...
    99+
    2023-11-11
    javascript 响应 numpy
  • 如何将Javascript的编程算法应用到Java函数中?
    在计算机编程中,算法是程序设计中最基础、最重要的部分之一。在不同的编程语言中,算法的实现方式也不同。但是,算法的核心思想是相通的。本文将介绍如何将Javascript的编程算法应用到Java函数中,希望能够对编程爱好者有所帮助。 首先,我们...
    99+
    2023-11-03
    函数 编程算法 javascript
  • JavaScript函数式编程的示例分析
    这篇文章给大家分享的是有关JavaScript函数式编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。看过许多关于函数式编程的讲解,但是其中大部分是停留在理论层面,还有...
    99+
    2024-04-02
  • 函数式编程在 Python 日志处理中的应用?
    函数式编程在 Python 日志处理中的应用 随着大数据时代的到来,日志数据的处理成为了一项重要的任务。Python 作为一种高效、易学的编程语言,被广泛应用于日志处理领域。在日志处理过程中,函数式编程成为了一种越来越流行的编程范式,它可以...
    99+
    2023-07-22
    日志 分布式 函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作