首页  >  文章  >  web前端  >  JavaScript 函数式编程简介:Applicatives #10

JavaScript 函数式编程简介:Applicatives #10

WBOY
WBOY原创
2024-07-18 13:47:12827浏览

Introduction to Functional Programming in JavaScript: Applicatives #10

Applicatives 提供了一种强大且富有表现力的方式来处理涉及上下文的函数和数据结构,例如可选值、异步计算或列表。应用程序扩展了仿函数的概念,允许将上下文中包装的函数应用到也包装在上下文中的值。

什么是应用程序?

applicative 是一种函子,它不仅支持将函数映射到包装值(如函子),还允许将包装在上下文中的函数应用到包装在上下文中的值。应用程序提供了一种处理涉及多个函数值的操作的方法。

应用词的属性
  1. Identity:将包装的标识函数应用于包装的值应该会产生包装的值。 [ text{A.of(x).ap(A.of(f))} 等价于 text{A.of(f(x))} ]
  2. 同态:将包装函数应用于包装值应该产生与将函数应用于值然后包装它相同的结果。 [ text{A.of(f).ap(A.of(x))} 等价于 text{A.of(f(x))} ]
  3. 互换:将包装函数应用于包装值应该等同于将包装值应用于应用包装函数的函数。 [ text{A.of(f).ap(u)} 等价于 text{u.ap(A.of(f => f(x)))} ]

在 JavaScript 中实现应用程序

让我们探索如何在 JavaScript 中实现和使用应用程序。

示例:将 Maybe 作为应用程序实现

Maybe 类型通常用于表示可选值。让我们扩展 Maybe 以支持应用操作。

class Maybe {
  constructor(value) {
    this.value = value;
  }

  static of(value) {
    return new Maybe(value);
  }

  map(fn) {
    return this.value === null || this.value === undefined
      ? Maybe.of(null)
      : Maybe.of(fn(this.value));
  }

  ap(maybe) {
    return this.value === null || this.value === undefined
      ? Maybe.of(null)
      : maybe.map(this.value);
  }
}

// Usage
const add = (a) => (b) => a + b;

const maybeAdd = Maybe.of(add);
const maybeTwo = Maybe.of(2);
const maybeThree = Maybe.of(3);

const result = maybeAdd.ap(maybeTwo).ap(maybeThree);
console.log(result); // Maybe { value: 5 }

在此示例中,Maybe 实现了 ap 方法,该方法将包装在 Maybe 上下文中的函数应用于包装在另一个 Maybe 上下文中的值。这允许涉及可选值的链接操作。

在实践中使用应用程序

应用程序在处理涉及多个上下文的计算时特别有用,例如组合多个异步操作或处理多个可选值。

示例:组合多个 Promise

让我们看看应用程序如何帮助组合多个 Promise。

const fetchData = (url) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(`Data from ${url}`);
    }, 1000);
  });
};

const add = (a) => (b) => a + b;

const promiseAdd = Promise.resolve(add);
const promiseTwo = fetchData('url1').then((data) => parseInt(data.split(' ')[2]));
const promiseThree = fetchData('url2').then((data) => parseInt(data.split(' ')[2]));

const result = promiseAdd
  .then((fn) => promiseTwo.then((a) => fn(a)))
  .then((fn) => promiseThree.then((b) => fn(b)));

result.then(console.log); // Output after 2 seconds: NaN (since "from" cannot be parsed as an int)

在此示例中,我们使用应用模式组合多个 Promise。虽然该示例在解析方面存在逻辑问题,但它演示了如何使用应用程序对涉及上下文的操作进行排序。

示例:处理多个可选值

应用程序对于组合多个可选值也很有用。

const add = (a) => (b) => a + b;

const maybeAdd = Maybe.of(add);
const maybeFive = Maybe.of(5);
const maybeNull = Maybe.of(null);

const result1 = maybeAdd.ap(maybeFive).ap(maybeFive); // Maybe { value: 10 }
const result2 = maybeAdd.ap(maybeFive).ap(maybeNull); // Maybe { value: null }

console.log(result1); // Maybe { value: 10 }
console.log(result2); // Maybe { value: null }

在此示例中,我们使用应用模式来组合多个 Maybe 值,优雅地处理 null 的存在。

以上是JavaScript 函数式编程简介:Applicatives #10的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn