为了账号安全,请及时绑定邮箱和手机立即绑定

对ramda 中的api使用 很难理解?

对ramda 中的api使用 很难理解?

BIG阳 2019-05-25 18:01:18
最近在看函数式编程。用的是ramda库。但各种api使用一脸懵逼。varfunc3=_.compose(p,trace("f3:"),f);varfunc4=_.filter(_.compose(p,trace("f4:"),f));console.log(func3(3))//36console.log(func4([3]))//[3]why?whathappened
查看完整描述

2 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

Ramda会自动柯里化,这么看可以理解不
_.filter(func3,[3])
func3(3)返回36,也就是true了,所以filter一遍3还在
                            
查看完整回答
反对 回复 2019-05-25
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

func3的代码还可以在抽象一下,console.log的函数也可以写到compose函数中。
ramda的哲学有两个,1是自动柯理化,就是函数的参数可以分步传入,也可以同时传入。分部传入的参数用到了闭包的概念。这个概念不理解透彻,柯理化就没有办法理解。恰好柯理化是函数式编程的核心之一。2是函数配置在前,参数最后传入。像是一个搅拌器一样,里面有很多的组件,装配好之后,就可以往里添加原料了。这个就配置成了函数的生产线,一边输入参数,就可以得到返回结果。
comopse是函数式组合,这里有高阶函数的定义,Javascript的数据类型除了简单数据类型其他的都是对象,对象的特点是可以传引用赋值的,并且javascript的函数式是传名调用的,func()的形式才会调用函数,所以函数表达式的应用可以传递给其他的函数,在调用时需要使用()关键字。这里仍然有闭包的概念。传递进compose的函数组组成了一个对象数组,虽有可以使用对象数组的遍历方法来逐次调用函数。这里数组吗?随意可以用数组的方向正向调用,也可以反向调用。当函数数组传递进compose函数时就形成闭包了。闭包其实明白了以后,感觉也没有什么。很多书介绍闭包的概念感觉不一样,其实万变不离其宗的,只不过闭包的应用是在是太广泛了,随便用个例子,不太熟悉的人就蒙了。还有就是闭包的概念基础有两个一个是js引擎的单事件循环,另一个是作用域。也不是太好理解。
闭包加高阶函数使得javascript的函数具有了可配置性。可配置性时函数式编程和命令式编程的分水岭。可配置性使得函数式编程中可以分辨出可变部分和不可变部分。这个地方是函数式编程需要思考的地方。
filter和map函数,reduce函数的概念其实基本一样。要在理解闭包的基础上,这个三个函数实现的源码。其实不是很复杂。
链式操作看起来和compose一样,但是有很大不同.链式操作和管道操作很容易混淆,管道操作和compose操作方方向不同,完成的操作是一样的。这里传递的数据对于类型没有要求。
链式操作提到了一个概念叫函子。其实这个概念如果你用过jQuery的链式操作,实现的就是函子操作。$(elements)把一个普通的元素包装成了jquery对象,别小看这样,一旦完成,元素不但可以使用jQuery对象的方法,还可以通过this把结果返回给jQuery对象,后续的链式操作就可以持续对这个对象进行操作。这个很厉害,所以很多复杂的数据变换操作都可以用链式操作来完成。
以我的观点,ramda其实没有太大难度,难点仍然是闭包的概念,要吃透这个才行。当我第一次脑海中形成了闭包的可配置性这个概念,似乎一下感觉找到了学习javascript的法宝。
                            
查看完整回答
反对 回复 2019-05-25
  • 2 回答
  • 0 关注
  • 463 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信