热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:你的对象可能是个函数!Max函数式编程学习

本文由编程笔记#小编为大家整理,主要介绍了你的对象可能是个函数!Max函数式编程学习相关的知识,希望对你有一定的参考价值。继续重发一篇旧
本文由编程笔记#小编为大家整理,主要介绍了你的对象可能是个函数!Max 函数式编程学习相关的知识,希望对你有一定的参考价值。


继续重发一篇旧文,为的是加原创和标签,消除强迫症。

这是我自己很喜欢的一篇,脑洞共深度一色,扯淡与哲学双飞

面向对象编程:万物皆对象。
函数式编程:万物皆函数。
综上,解得:
朋友你的对象可能是个函数!

有对 “Functional Programming × Creative Coding” 感兴趣的盆友,欢迎来微信群、情报中心交流。
以后关于此文的更新修订我将直接记录在实验编程情报中心(语雀)。

我以前按官方Max7以后形成的标准叫法,把MaxMSP叫为Max,因为MSP只是Max生态里的一部分。
迫于约定俗成和SEO,后来的文章里我都叫回MaxMSP了。





先来一首定场诗:

There is a cycle, a rhythm to the universe.

Today one program will be popular, tomorrow another.

Today 500 bugs will be fixed, tomorrow another 500 will appear.

To understand life is to know that the rhythm exists.

To understand Zen is to live outside this rhythm,

detached from the everyday concerns of life.

Only then can the mind be free.

-----摘自《The Tao of Programming(编程之道)》



面向对象编程(Object-Oriented Programming - OOP)理论认为,“万物皆对象”。

不是搞对象的对象。

其实严格地说,搞对象的对象,好像也是对象。


面向对象可能是学校和企业产品上使用最多的编程范式。

一旦被洗脑,很难掰回来。如:对象说的永远是对的。



近几年开始接触和使用函数式响应式编程(Functional Reactive Programming - FRP)。

FRP组合了响应式编程(Reactive Programming - RP)与函数式编程(Functional Programming - FP)。


响应式编程 RP:侧重于处理异步数据流,可以监听数据流并做出响应。 

比如Excel的单元格,可以包含类似"=B1+C1"的公式,这类单元格的值会依据其他单元格(B1和C1)的值的变化而变化 。


你的对象可能是个函数!Max 函数式编程学习

图片出处见水印


你的对象可能是个函数!Max 函数式编程学习

响应式编程处理流、监听流、根据流迅速做出响应。

这一点,我在幼年自学截拳道时就懂了:

“Be water, my friend. ”



函数式编程 FP:更像是在做数学运算。

“把运算过程尽量写成一系列嵌套的函数调用”(阮一峰,http://www.ruanyifeng.com/blog/2012/04/functional_programming.html)。

你的对象可能是个函数!Max 函数式编程学习

注意,上图函数 f(x) 的输入参数 x,也可以是另一个函数。



尽管对函数式响应式编程 FRP 不算太陌生,也曾使用 ReactCocoa Objective-C 上线过几款 App,将 signal,map,subscribe 等等用的不亦乐乎。

但是从 “万物皆对象”,切换到 “万物皆函数”,还是有点懵。


尤其在融会贯通了 OOP 和 FP 后,想到“其实你的对象是个函数”,更是大写的锟斤拷烫烫烫。 


你的对象可能是个函数!Max 函数式编程学习

图片出处见水印



所以还是把理论丢一边,例子摆中间:


你的对象可能是个函数!Max 函数式编程学习


此图源自很火的一篇 FRP 教程:

《The introduction to Reactive Programming you've been missing》

https://gist.github.com/staltz/868e7e9bc2a7b8c1f754


图中的黑色箭头线条,即代表 stream,数据流。


而 “灰色的矩形是把一个 stream 转换成另一个 stream 的函数。我们会每隔 250ms 把所有 click stream 都缓冲在一个数组里面,这是 buffer(stream.throttle(250ms)) 所要做的事情。

于是,我们得到的是一个包含多个数组的 stream,接着调用 map() 函数,把每个数组都映射成一个整数(数组的长度)。

随后,我们调用 filter(x >= 2) 来过滤掉那些长度为 1 的数组。

综上,我们只需要3次操作就能得到我们想要的 stream 。最后,我们调用 subscribe() 来监听,响应我们想要做的事情。”

此段引自知乎。

https://zhuanlan.zhihu.com/p/25552305


实现这一段数据流的转换,用 RxJS 来写的话,只需要这样4行:

var multiClickStream = clickStream
   .buffer(function() { return clickStream.throttle(250); })
   .map(function(list) { return list.length; })
   .filter(function(x) { return x >= 2; });

得到 multiClickStream 后,subscribe 它,就可以监听到数据流中的值:

multiClickStream.subscribe(function (numclicks) {
   console.log(numclicks);
)};


上述对 stream 的函数式操作,去掉换行后: 

stream.buffer().map().filter()”

连起来看丝般顺滑。


如果把 “.” 改为 “-”:

stream - buffer() - map() - filter()”

是不是看着跟连连看编程很像了?


以Max为例:


你的对象可能是个函数!Max 函数式编程学习


上图即是那段 RxJS 代码的 Max 版本,功能一样的。

一次单击时,并不会从 stream 最后输出,最后的 print log 里显示的仍是之前的一次3连击。


如果来一发4连击,则会通过 filter,最终得到: 


你的对象可能是个函数!Max 函数式编程学习


可以看到,上图中绿色部分的 map 与 filter,细节的处理并不太“函数式”,还是像在用命令式告诉机器如何执行指令,而不是优雅的书写函数。


伯克利大学的新音乐与音频技术研究中心,Center for New Music and Audio Technologies (CNMAT),设计开发了一套 Max 的 Library —— ODOT。

ODOT 基于 OSC,就是那个熟悉的 Open Sound Control。


首先,重点在于利用了 OSC 对数据的封装格式,name - value 结构。


其次,OSC 数据可以方便的在程序内从一个模块流向另一个模块,甚至从硬件 Arduino,通过网络,流向 Max、Processing、C、Java 等软件模块。


用 ODOT 重构上文的 map 与 filter 模块,如下图所示: 


你的对象可能是个函数!Max 函数式编程学习


o.pack 是把流入的 stream 数据,封装成 OSC 格式。

而后边两句,就是很直观的函数书写了:

/data = length(/data) ; //取长度
o.if /data >= 2 ; //过滤2以上的数据。


ODOT 还可以实现更多函数式特征的功能


高阶函数: 


你的对象可能是个函数!Max 函数式编程学习


递归:


你的对象可能是个函数!Max 函数式编程学习


你的对象可能是个函数!Max 函数式编程学习

此图自下方参考论文


另,利用 OSC 数据结构,ODOT 其实还可以实现面向对象的风格,可参考下方论文。


ODOT 下载

http://cnmat.berkeley.edu/downloads


参考论文

《Composability for Musical Gesture Signal Processing using new OSC-based Object and Functional Programming Extensions to Max/MSP》

http://john-maccallum.com/writings/odot_nime_2011/odot_nime_2011.pdf


《DYNAMIC, INSTANCE-BASED, OBJECT-ORIENTED PROGRAMMING IN MAX/MSP USING OPEN SOUND CONTROL MESSAGE DELEGATION》

http://quod.lib.umich.edu/cgi/p/pod/dod-idx/dynamic-instance-based-object-oriented-programming-in-maxmsp.pdf?c=icmc;idno=bbp2372.2011.099


谢谢阅读

---------------

不要慌,再回味一下开篇定场诗里的精华:

Today 500 bugs will be fixed, tomorrow another 500 will appear.


你的对象可能是个函数!Max 函数式编程学习






英文版:
Your Object may be a Function! MaxMSP functional programming learning”
https://medium.com/@contra/your-object-may-be-a-function-maxmsp-functional-programming-learning-e04a147a1b85


代码开源:
https://github.com/avantcontra/maxmsp-functional-programming





原文结束,可以去点赞啦……Orz


你的对象可能是个函数!Max 函数式编程学习






关于实验编程完整详情






语雀情报中心



  • 日常技巧快速分享


  • 源代码、源文件、资源下载



  • 教学内容,课程资料



详情请看:





付费教学

情报中心还有付费教学和VIP会员专属的小组。

在这里会放付费课程、教学资料、作业点评、问题解答等内容。

目前试推付费咨询和VIP会员,付费课程也在更新上架中。

详情请至:





  • 或者扫码直接进入商店:


你的对象可能是个函数!Max 函数式编程学习

答疑优先顺序:



  1. 付费咨询、课程学员、VIP会员(必答,优先)


  2. 知识星球(必答)


  3. 语雀情报中心(必答,抽空)


  4. 微信群(选答,尽量)







知识星球

知识星球是我感谢各位赞赏的地方,在这里你将持续获取大部分系列的源代码以及无限次图文答疑。
还可以直接在情报中心的知识星球专属下载区获取资源。

有一点付费门槛,平均一天几毛钱,象征性过滤伸手党,也是对赞赏用户的尊重。

你的对象可能是个函数!Max 函数式编程学习




开源

如【编程德鲁伊】系列的大部分代码开源在全球最大

推荐阅读
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • 一、使用Microsoft.Office.Interop.Excel.DLL需要安装Office代码如下:2publicstaticboolExportExcel(S ... [详细]
  • 本文由chszs撰写,详细介绍了Apache Mina框架的核心开发流程及自定义协议处理方法。文章涵盖从创建IoService实例到协议编解码的具体步骤,适合希望深入了解Mina框架应用的开发者。 ... [详细]
  • 本文分享了作者在使用LaTeX过程中的几点心得,涵盖了从文档编辑、代码高亮、图形绘制到3D模型展示等多个方面的内容。适合希望深入了解LaTeX高级功能的用户。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • 从CodeIgniter中提取图像处理组件
    本指南旨在帮助开发者在未使用CodeIgniter框架的情况下,如何独立使用其强大的图像处理功能,包括图像尺寸调整、创建缩略图、裁剪、旋转及添加水印等。 ... [详细]
  • 在AngularJS中,有时需要在表单内包含某些控件,但又不希望这些控件导致表单变为脏状态。例如,当用户对表单进行修改后,表单的$dirty属性将变为true,触发保存对话框。然而,对于一些导航或辅助功能控件,我们可能并不希望它们触发这种行为。 ... [详细]
  • 将XML数据迁移至Oracle Autonomous Data Warehouse (ADW)
    随着Oracle ADW的推出,数据迁移至ADW成为业界关注的焦点。特别是XML和JSON这类结构化数据的迁移需求日益增长。本文将通过一个实际案例,探讨如何高效地将XML数据迁移至ADW。 ... [详细]
  • 本文探讨为何Request对象的外观设计被认为是精妙的,重点在于其如何利用门面模式确保数据安全,同时保持系统的高效交互。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • 探讨了在HTML表单中使用元素代替进行表单提交的方法。 ... [详细]
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
author-avatar
955单车小宏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有