Applicatives 提供了一种强大且富有表现力的方式来处理涉及上下文的函数和数据结构,例如可选值、异步计算或列表。应用程序扩展了仿函数的概念,允许将上下文中包装的函数应用到也包装在上下文中的值。
applicative 是一种函子,它不仅支持将函数映射到包装值(如函子),还允许将包装在上下文中的函数应用到包装在上下文中的值。应用程序提供了一种处理涉及多个函数值的操作的方法。
让我们探索如何在 JavaScript 中实现和使用应用程序。
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。
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中文网其他相关文章!