热门标签 | 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 函数式编程学习




开源

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

推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • IB 物理真题解析:比潜热、理想气体的应用
    本文是对2017年IB物理试卷paper 2中一道涉及比潜热、理想气体和功率的大题进行解析。题目涉及液氧蒸发成氧气的过程,讲解了液氧和氧气分子的结构以及蒸发后分子之间的作用力变化。同时,文章也给出了解题技巧,建议根据得分点的数量来合理分配答题时间。最后,文章提供了答案解析,标注了每个得分点的位置。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
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社区 版权所有