05|map、reduce和monad如何围绕值进行操作?
数据的核心操作
map 映射和函子
- 深入了解
- 翻译
- 解释
- 总结
JavaScript中的值操作是函数式编程中的核心概念,本文通过介绍map、reduce和monad的概念,深入探讨了围绕值进行操作的原理和应用。文章首先通过JavaScript中数组自带的map、filter和reduce方法,讲解了这几种方法对值的核心操作,以及如何通过映射和过滤来做到reduce。其次,详细解释了函子(functor)的概念,以及map映射和过滤器(filter)的作用。在讲解reduce时,重点介绍了缩减器(reducer)函数和初始值的作用,以及如何利用映射和过滤的方法来实现reduce。最后,文章引入了单子(monad)的概念,通过array作为functor和chain方法函数的使用,展示了monad的作用。通过具体的JavaScript代码示例,读者可以深入了解map、reduce和monad在函数式编程中的应用。此外,文章还提到了应用函子(applicative)和pointed函子的概念,以及对数组中array.of工厂方法的介绍。总结来说,本文通过深入浅出的方式,帮助读者理解了函数式编程中围绕值进行操作的核心概念,为进一步学习函数式编程打下了基础。
《JavaScript 进阶实战课》,新⼈⾸单¥59
全部留言(8)
- 最新
- 精选
- 思文单子、函子这些感念看完还是有些陌生,有什么办法深入理解下吗,比如需要看那些文章等等
作者回复: Jack Widman写的《Learning Functional Programming》是一本不错的入门读物。
2022-10-26归属地:北京44 - Yum.Xfunction Just(val) { return { map }; function map(fn) { return Just( fn( val ) ); } } var A = Just( 10 ); var B = A.map( v => v * 2 ); // 20 运行了这段代码,这里回的不是20
作者回复: 如果要“打印”结果的话,可以加一个方法: function Just(val) { return { map, log }; function log() { return `Just(${ val })`; } } B.log(); // 20
2022-10-18归属地:北京31 - linap 这里我还是不太理解。根据 exp: 、、、 const a = Just(1); // Just(1) const b = Just(2); // Just(2) const c = a.map(addFive); // Just(6) c.ap(b); // Error: Just(6(2)) -> 6 is not a function 、、、 这里的调用应该会出现问题。
作者回复: 要使用ap的话,monad 中需要持有一个函数,并且这个函数应该要持有并记住 a 的变量。我看不到你的 addFive() 的具体实现,但是通常 a.map() 中应该是一个 curry(func),例如:a.map(curry(func))。
2022-12-07归属地:海南 - 朱基在“reduce 和缩减器”这一节的课程里,突然显示了一代码示例,var getSessionId = partial( prop, "sessId" );…if (orders != null) processOrders( orders ); 它是用来说明上面所说的:“我们没有必要为了几乎没有负面影响的副作用—改变了原数据,而牺牲性能”的吗?
作者回复: 之前有些勘误,已经修改了。
2022-11-10归属地:海南 - 李滨array 作为 functor 小节下面的那个例子 : Just return 的map函数的定义不对吧 ,map应该直接返回 fn(val)吧?
作者回复: 这里没啥问题。映射后,返回之后的也应该是一个Just包装的值。 例如: var A = Just( 30 ); var B = A.map( v => v * 2 ); // Just(60)
2022-10-09归属地:北京2 - Nuvole Bianchefunction Just(val) { return { map, log }; function map(fn) { return Just(fn(val)); } function log() { return `Just(${val})`; } } var A = Just(10); var B = A.map((v) => v * 2); // 20 console.log(B.log()); // Just(20) console.log(A.log()); // Just(10) 反复看后,注意到这里其实生成了两个闭包,一个是针对A的闭包这时val是10,二针对B的闭包中val存放的是20。作为小白的知道这种写法非常nobility,但现阶段的我完全不知道这种写法的具体使用场景。2023-01-16归属地:上海1
- 海绵薇薇“而缩减 reduce 除了能独立来实现以外,也可以用映射 map 和过滤 filter 的方法来实现。" 这句话是不是反了🤣,”map和filter除了能独立实现以外,也可以用reduce的方法来实现。“还是我理解的有点问题🤣。2023-01-12归属地:北京1
- 轩爷function Just(val) { return { map }; function map(fn) { return fn( val ) ; } } var A = Just( 10 ); var B = A.map( v => v * 2 ); // 20 function Just(val) { return { map }; function map(fn) { return Just( fn( val ) ); } } var A = Just( 10 ); var B = A.map( v => v * 2 ); // { map: f}2023-02-10归属地:北京