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

发布于 2022-09-05 03:32:09 字数 257 浏览 19 评论 0

最近在看函数式编程。用的是ramda库。

但各种api使用一脸懵逼。

  var func3=_.compose(p,trace("f3:"), f);
  var func4=_.filter(_.compose(p,trace("f4:"), f));
  console.log(func3(3))//36
  console.log(func4([3]))//[3] why? what happened

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦亿 2022-09-12 03:32:09

Ramda 会自动柯里化,这么看可以理解不

_.filter(func3, [3])

func3(3) 返回 36,也就是 true 了,所以 filter 一遍 3 还在

眼泪都笑了 2022-09-12 03:32:09

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的法宝。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文