深入理解函数式编程(下)

函数式编程是一种历史悠久的编程范式。作为演算法,它的历史可以追溯到现代计算机诞生之前的λ演算,本文希望带大家快速了解函数式编程的历史、基础技术、重要特性和实践法则。在内容层面,主要使用JavaScript语言来描述函数式编程的特性,并以演算规则、语言特性、范式特性、副作用处理等方面作为切入点,通过大量演示示例来讲解这种编程范式。同时,文末列举比较一些此范式的优缺点,供读者参考。因为文章涵盖一些范畴论知识,可能需要其他参考资料一起辅助阅读。

1. 前文回顾

在上篇中,我们分析了函数式编程的起源和基本特性,并通过每一个特性的示例来演示这种特性的实际效果。首先,函数式编程起源于数理逻辑,起源于λ演算,这是一种演算法,它定义一些基础的数据结构,然后通过归约和代换来实现更复杂的数据结构,而函数本身也是它的一种数据。其次,我们探讨了很多函数式编程的特性,比如:

  • First Class
  • 纯函数
  • 引用透明
  • 表达式
  • 高阶函数
  • 柯里化
  • 函数组合
  • point-free
  • …

但我们也指出了一个实际问题:不能处理副作用的程序是毫无意义的。我们的计算机程序随时都在产生副作用。我们程序里面有大量的网络请求、多媒体输入输出、内部状态、全局状态等,甚至在提倡“碳中和”的今天,电脑的发热量也是一个不容小觑的副作用。那么我们应该如何处理这些问题呢?

2. 本文简介

本文通过深入函数式编程的副作用处理及实际应用场景,提供一个学习和使用函数式编程的视角给读者。一方面,这种副作用管理方式是一种高级的抽象形式,不易理解;另一方面,我们在学习和使用函数式编程的过程中,几乎都会遇到类似的副作用问题需要解决,能否解决这个问题也决定了一门函数式编程语言最终是否能走上成功。

本文主要分为三个部分:

  • 副作用处理方式
  • 函数式编程的应用
  • 函数式编程的优缺点比较

3. 副作用处理:单子Monad,一种不可避免的抽象

上面说的,都是最基础的JavaScript概念+函数式编程概念。但我们还留了一个“坑”。

如何去处理IO操作?

我们的代码经常在和副作用打交道,如果要满足纯函数的要求,几乎连一个需求都完成不了。不用急,我们来看一下React Hooks。React Hooks的设计是很巧妙的,以useEffect为例:

图 43

在函数组件中,useState用来产生状态,在使用useEffect的时候,我们需要挂载这个state到第二个参数,而第一个参数给到的运行函数在state变更的时候被调用,被调用时得到最新的state。

这里面有一个状态转换:

图 44

React Hooks给我们的启发是,副作用都被放到一个状态节点里面去被动触发,行程一个单向的数据流动。而实际上,函数式编程语言确实也是这么做的,把副作用包裹到一个特殊的函数里面。

如果一个函数既包含了我们的值,又封装了值的统一操作,使得我们可以在它限定的范围内进行任意运算,那么,我们称这种函数类型为Monad。Monad是一种高级别的思维抽象。

3.1 什么是Monad?

先思考一个问题,下面两个定义有什么区别?

图 45

num1是数字类型,而num2是对象类型,这是一个直观的区别。

不过,不仅仅如此。利用类型,我们可以做更多的事。因为作为数字的num1是支持加减乘除运算的,而num2却不行,必须要把它视为一个对象{val: 2},并通过属性访问符num2.val才能进行计算num2.val + 2。但我们知道,函数式编程是不能改变状态的,现在为了计算num2.val被改变了,这不是我们期望的,并且我们使用属性操作符去读数据,更像是在操作对象,而不是操作函数,这与我们的初衷有所背离。

现在我们把num2当作一个独立的数据,并假设存在一个方法fmap可以操作这个数据,可能是这样的。

图 46

得到的还是对象,但操作通过一个纯函数addOne去实现了。

上面这个例子里面的Num,实际上就是一个最简单的Monad,而fmap是属于Functor(函子)的概念。我们说函数就是从一个数据到另一个数据的映射,这里的fmap就是一个映射函数,在范畴论里面叫做态射(后面讲解)。

由于有一个包裹的过程,很多人会把Monad看作是一个盒子类型。但Monad不仅是一个盒子的概念,它还需要满足一些特定的运算规律(后面涉及)。

但是我们直接使用数字的加减乘除不行吗?为什么一定要Monad类型?

首先,fmap的目的是把数据从一个类型映射到另一个类型,而JavaScript里面的map函数实际上就是这个功能。

图 47

我们可以认为Array就是一个Monad实现,map<T, K>把Array< T >类型映射到Array< K >类型,操作仍然在数组范畴,数组的值被映射为新的值。 如果用TypeScript来表示,会不会更清晰一点?

图 48

看起来Monad只是一个实现了fmap的对象(Functor类型,mappable接口)而已。但Monad类型不仅是一个Functor,它还有很多其他的工具函数,比如:

  • bind函数
  • flatMap函数
  • liftM函数

这些概念在学习Haskell时可以遇到,本文不作过多提及。这些额外的函数可以帮助我们操作被封装起来的值。

3.2 范畴、群、幺半群

范畴论是一种研究抽象数学形式的科学,它把我们的数学世界抽象为两个概念:

  • 对象
  • 态射

为什么说这是一种形式上的抽象呢?因为很多数学的概念都可以被这种形式所描述,比如集合,对集合范畴来说,一个集合就是一个范畴对象,从集合A到集合B的映射就是集合的态射,再细化一点,整数集合到整数集合的加减乘操作构成了整数集合的态射(除法会产生整数集合无法表示的数字,因此这里排除了除法)。又比如,三角形可以被代数表示,也可以用几何表示、向量表示,从代数表示到几何表示的运算就可以视为三角形范畴的一种态射。

总之,对象描述了一个范畴中的元素,而态射描述了针对这些元素的操作。范畴论不仅可以应用到数学科学里面,在其他科学里面也有一些应用,实际上,范畴论就是我们描述客观世界的一种方式(抽象形式)。

图 49

相对应的,函子就是描述一个范畴对象和另一个范畴对象间关系的态射,具体到编程语言中,函子是一个帮助我们映射一个范畴元素(比如Monad)到另一个范畴元素的函数。

群论(Group)研究的是群这种代数结构,怎么去理解群呢?比如一个三角形有三个顶点A/B/C,那么我们可以表示一个三角形为ABC或者ACB,三角形还是这个三角形,但是从ABC到ACB一定是经过了某种变换。这就像范畴论,三角形的表示是范畴对象,而一个三角形的表示变换到另一个形式,就是范畴的态射。而我们说这些三角形表示方式的集合为一个群。群论主要是研究变换关系,群又可以分为很多种类,也有很多规律特性,这不在本文研究范围之内,读者可以自行学习相关内容。

科学解释一个Monad为自函子范畴上的幺半群。如果没有学习群论和范畴论的话,我们是很难理解这个解释的。

图 50

简单来说先固定一个正方形abcd,它和它的几何变换方式(旋转/逆时针旋转/对称/中心对称等)形成的其他正方形一起构成一个群。从这个角度来说,群研究的事物是同一类,只是性质稍有不一样(态射后)。

另外一个理解群的概念就是自然数(构成一个群)和加法(群的二元运算,且满足结合律,半群)。

图 51

到此,我们可以理解Monad为:

  1. 满足自函子运算(从A范畴态射到A范畴,fmap是在自己空间做映射)。
  2. 满足含幺半群的结合律。

很多函数式编程里面都会实现一个Identity函数,实际就是一个幺元素。比如JavaScript中对Just满足二元结合律可以这么操作:

图 52

3.3 Monad范畴:定律、折叠和链

我们要在一个更大的空间上讨论这个范畴对象(Monad)。就像Number封装了数字类型,Monad也封装了一些类型。

图 53

Monad需要满足一些定律:

  • 结合律:比如a · b · c = a · (b · c)。
  • 幺元:比如a · e = e · a = a。

一旦定义了Monad为一类对象,fmap为针对这种对象的操作,那么定律我们可以很容易证明:

图 54

我们可以通过Monad Just上挂载的操作来对数据进行计算,这些运算是限定在了Just上的,也就是说你只能得到**Just(…)**类型。要获取原始数据,可以基于这个定义一个fold方法。

图 55

fold(折叠,对应能力我们称为foldable)的意义在于你可以将数据从一个特定范畴映射到你的常用范畴,比如面向对象语言的toString方法,就是把数据从对象域转换到字符串域。

JavaScript中的Array.prototype.reduce其实就是一个fold函数,它把数据从Array范畴映射到其他范畴。

一旦数据类型被我们锁定在了Monad空间(范畴),那我们就可以在这个范畴内连续调用fmap(或者其他这个空间的函数)来进行值操作,这样我们就可以链式处理我们的数据。

图 56

3.4 Maybe和Either

有了Just的概念,我们再来学习一些新的Monad概念。比如Nothing。

图 57

Nothing表示在Monad范畴上没有的值。和Just一起正好描述了所有的数据情况,合称为Maybe,我们的Maybe Monad要么是Just,要么是Nothing。这有什么意义呢?

其实这就是模拟了其他范畴内的“有”和“无”的概念,方便我们模拟其他编程范式的空值操作。比如:

图 58

这种情况下我们需要去判断x和y是否为空。在Monad空间中,这种情况就很好表示:

图 59

我们在Monad空间中消除了烦人的!== null判断,甚至消除了三元运算符。一切都只有函数。实际使用中一个Maybe要么是Just要么是Nothing。因此,这里用**Maybe(…)**构造可能让我们难以理解。

如果非要理解的话,可以理解Maybe为Nothing和Just的抽象类,Just和Nothing构成这个抽象类的两个实现。实际在函数式编程语言实现中,Maybe确实只是一个类型(称为代数类型),具体的一个值有具体类型Just或Nothing,就像数字可以分为有理数和无理数一样。

除了这种值存在与否的判断,我们的程序还有一些分支结构的方式,因此我们来看一下在Monad空间中,分支情况怎么去模拟?

图 60

假设我们有一个代数类型Either,Left和Right分别表示当数据为错误和数据为正确情况下的逻辑。

图 61

这样,我们就可以使用“函数”来替代分支了。这里的Either实现比较粗糙,因为Either类型应该只在Monad空间。这里加入了布尔常量的判断,目的是好理解一些。其他的编程语言特性,在函数式编程中也能找到对应的影子,比如循环结构,我们往往使用函数递归来实现。

3.5 IO的处理方式

终于到IO了,如果不能处理好IO,我们的程序是不健全的。到目前为止,我们的Monad都是针对数据的。这句话对也不对,因为函数也是一种数据(函数是第一公民)。我们先让Monad Just能存储函数。

图 62

你可以想象为Just增加了一个抽象类实现,这个抽象类为:

图 63

这个抽象类我们称为“应用函子”,它可以保存一个函数作为内部值,并且使用apply方法可以把这个函数作用到另一个Monad上。到这里,我们完全可以把Monad之间的各种操作(接口,比如fmap和apply)视为契约,也就是数学上的态射。

现在,如果我们有一个单子叫IO,并且它有如下表现:

图 64

我们把这种类型的Monad称为IO,我们在IO中处理打印(副作用)。你可以把之前我们学习到的类型合并一下,得到一个示例:

图 65

通常一个程序会有一个主入口函数main,这个main函数返回值类型是一个IO,我们的副作用现在全在IO这个范畴下运行,而其他操作,都可以保持纯净(类型运算)。

IO类型让我们可以在Monad空间处理那些烦人的副作用,这个Monad类型和Promise(限定副作用到Promise域处理,可链式调用,可用then折叠和映射)很像。

4.函数式编程的应用

除了上面我们提到的一些示例,函数式编程可以应用到更广的业务代码开发中,用来替代我们的一些基础业务代码。这里举几个例子。

4.1 设计一个请求模块

图 66

用这种方式构建的模块,组合和复用性很强,你也可以利用lodash的其他库对req做一个其他改造。我们调用业务代码的时候只管传递params,分支校验和错误检查就教给validate.js里面的高阶函数就好了。

4.2 设计一个输入框

图 67

这个例子也是来源于前端常见的场景。我们使用函数式编程的思想,把多个看似不相关的函数进行组合,得到了业务需要的subscribe函数,但同时,上面的任意一个函数都可以被用于其他功能组合。比如callback函数可以直接给dom回调,listenInput可以用于任意一个dom。

这种通过高阶组件不停组合得到最终结果的方式,我们可以认为就是函数式的。(尽管它没有像上一个例子一样引入IO/Monad等概念)

4.3 超长文本省略:Ramdajs为例

图 68

这个也是常见的前端场景,当文本长度大于X时,显示省略号,这个实现使用Ramdajs。这个过程中你就像是在搭积木,很容易就把业务给“搭建”完成了。

5. 函数式编程库、语言

函数式编程的库可以学习:

  • Ramda.js:函数式编程库
  • lodash.js:函数工具
  • immutable.js:数据不可变
  • rx.js:响应式编程
  • partial.lenses:函数工具
  • monio.js:函数式编程工具库/IO库
  • …

你可以结合起来使用。下面是Ramda.js示例:

图片69

而纯函数式语言,有很多:

  • Lisp 代表软件 emacs…
  • Haskell 代表软件 pandoc…
  • Ocaml …
  • …

6. 总结

函数式编程并不是什么“黑科技”,它已经存在的时间甚至比面向对象编程更久远。希望本文能帮助大家理解什么是函数式编程。

现在我们来回顾先览,实际上,函数式编程也是程序实现方式的一种,它和面向对象是殊途同归的。在函数式语言中,我们要构建一个个小的基础函数,并通过一些通用的流程把他们粘合起来。举个例子,面向对象里面的继承,我在函数式编程中可以使用组合compose或者高阶函数hoc来实现。

尽管在实现上是等价的,但和面向对象的编程范式对比,函数式编程有很多优点值得大家去尝试。

6.1 优点

除了上面提到的风格和特性之外,函数式编程相对其他编程范式,有很多优点:

  • 函数纯净 程序有更少的状态量,编码心智负担更小。随着状态量的增加,某些编程范式构建的软件库代码复杂度可能呈几何增长,而函数式编程的状态量都收敛了,对软件复杂度带来的影响更小。
  • 引用透明性 可以让你在不影响其他功能的前提下,升级某一个特定功能(一个对象的引用需要改动的话,可能牵一发而动全身)。
  • 高度可组合 函数之间复用方便(需要关注的状态量更少),函数的功能升级改造也更容易(高阶组件)。
  • 副作用隔离 所有的状态量被收敛到一个盒子(函数)里面处理,关注点更加集中。
  • 代码简洁/流程更清晰 通常函数式编程风格的程序,代码量比其他编程风格的少很多,这得益于函数的高度可组合性以及大量的完善的基础函数,简洁性也使得代码更容易维护。
  • 语义化 一个个小的函数分别完成一种小的功能,当你需要组合上层能力的时候,基本可以按照函数语义来进行快速组合。
  • 惰性计算 被组合的函数只会生成一个更高阶的函数,最后调用时数据才会在函数之间流动。
  • 跨语言统一性 不同的语言,似乎都遵从类似的函数式编程范式,比如Java 8的lambda表达式,Rust的collection、匿名函数;而面向对象的实现,不同语言可能千差万别,函数式编程的统一性让你可以舒服地跨语言开发。
  • 关键领域应用 因为函数式编程状态少、代码简洁等特点,使得它在交互复杂、安全性要求高的领域有重要的应用,像Lisp和Haskell就是因上一波人工智能热而火起来的,后来也在一些特殊的领域(银行、水利、航空航天等)得到了较大规模的应用。
  • …

6.2 不足

当然,函数式编程也存在一些不足之处:

  • 陡峭的学习曲线 面向对象和命令式编程范式都是贴近我们的日常习惯的方式,而函数式编程要更抽象一些,要想更好地管理副作用,你可能需要学习很多新的概念(响应式、Monad等),这些概念入门很难,而且是一个长期积累的过程。
  • 可能的调用栈溢出问题 惰性计算在一些电脑或特种程序架构上可能有函数调用栈错误(超长调用链、超长递归),另外许多函数式编程语言需要编译器支持尾递归优化(优化为循环迭代)以得到更好的性能。
  • 额外的抽象负担 当程序有大量可变状态、副作用时,用函数式编程可能造成额外的抽象负担,项目开发周期可能会延长,这时可能用其他抽象方式更好(比如OOP)。
  • 数据不变性的问题 为了数据不变,运行时可能会构建生成大量的数据副本,造成时间和空间消耗更大,拖慢性能;同时数据不可变性可能会造成构建一些基础数据结构的时候语法不简洁,性能也更差(比如LinkedList、HashMap等数据结构)。
  • 语义化的问题 往往为了开发一个功能,去造许多的基础函数,大量业务组件想要语义化的命名,也会带给开发人员很多负担;并且功能抽象能力因人而异,公共函数往往不够公用或者过度设计。
  • 生态问题 函数式编程在工业生产领域因其抽象性和性能带来的问题,被许多开发者拒之门外,一些特定功能的解决方案也更小众(相比其他编程范式),生态也一直比较小,这成为一些新的开发人员学习和使用函数式编程的又一个巨大障碍。
  • …

日常业务开发中,往往我们需要取长补短,在适合的领域用适合的方法/范式。大家只要要记住,软件开发并没有“银弹”。

7. FAQ

Q:你觉得Promise是不是一种Monad IO模型?

A:我认为是的。纯函数是没有异步概念的,Promise用了一种很棒的方式把异步和IO转化为了.then函数。你仍然可以在.then函数中写纯粹的函数,也可以在.then函数中调用其他的Promise,这就和IO Monad的行为非常像。

Q:你愿意在生产中使用Haskell/Lisp/Clojure等纯函数式语言吗?

A:不论是否愿意使用,现在很多语言都开始引入函数式编程语法了。并不是说函数式编程一定是优秀的,但它至少没有那么恐怖。有一点可以肯定的是,学习函数式编程可以扩展我们的思维,增加我们看问题的角度。

Q:有没有一些可以预见的好处?

A:有的。比如强制你写代码的时候去关注状态量(多少、是否引用值、是否变更等),这或多或少可以帮助你写代码的时候减少状态量的使用,也慢慢地能复合一些状态量,写出更简洁的代码。

Q:函数式编程能给业务带来什么好处?

A:业务拆分的时候,函数式的思维是单向的,我们会通过实现,想到它对应需要的基础组件,并递归地思考下去,功能实现从最小粒度开始,上层逐步通过函数组合来实现。相比于面向对象,这种方式在组合上更方便简洁,更容易把复杂度降低,比如面向对象中可能对象之间的相互引用和调用是没有限制的,这种模式带来的是思考逻辑的时候思维会发散。

这种对比在业务复杂的情况下更加明显,面向对象必须要优秀的设计模式来实现控制代码复杂度增长不那么快,而函数式编程大多数情况下都是单向数据流+基础工具库就减少了大量的复杂度,而且产生的代码更简洁。

8. 作者简介

俊杰,美团到家研发平台/医药技术部前端工程师。

9. 参考文献

  1. 维基百科:函数式编程/lambda演算/范畴论/集合论/群论。
  2. Github:getify/Functional-Light-JS
  3. 《Learn You A Haskell For Great Good!》
  4. 《Deep JavaScript》
  5. 其他:各类在线博客

阅读美团技术团队更多技术文章合集

前端 | 算法 | 后端 | 数据 | 安全 | 运维 | iOS | Android | 测试

| 在公众号菜单栏对话框回复【2021年货】、【2020年货】、【2019年货】、【2018年货】、【2017年货】等关键词,可查看美团技术团队历年技术文章合集。

| 本文系美团技术团队出品,著作权归属美团。欢迎出于分享和交流等非商业目的转载或使用本文内容,敬请注明“内容转载自美团技术团队”。本文未经许可,不得进行商业性转载或者使用。任何商用行为,请发送邮件至tech@meituan.com申请授权。

相关推荐

美团 LongCat-2.5 开源:从看见,到抵达

美团正式开源 LongCat-2.5,采用MIT协议,支持商用推理部署与二次训练,无需额外授权。

美团技术团队 185

美团正式发布 LongCat-2.5:面向智能体任务的原生多模态模型

美团正式发布 LongCat-2.5,这是一个面向长程智能体任务的原生多模态模型。模型总参数量为 1.6 万亿,每个 token 激活约 480 亿参数,在 LongCat-2.0 的基础上进一步强化了原生视觉理解与智能体编程能力。

美团技术团队 2418

如何在“不能出错”的系统里使用 AI Coding?分布式存储实践与边界

AI 能让代码写得更快,但在「不能出错」的分布式存储系统里,如何确保提效不变成风险?本文结合美团基础技术部在 AI 评审、问题排查和自动化开发中的真实实践,分享 AI 能帮上什么忙、容易在哪些地方犯错,以及哪些地方仍需要人来把关。比「多写代码」更重要的,是让代码和结论经得起验证。希望这些经验能为复杂系统中的 AI 应用提供参考,在享受效率提升的同时,守住质量与稳定性的底线。

美团技术团队 327

从 LOOP 到图探索 —— 算法模型的 AutoResearch 自进化系统架构演进之路

算法工程师的一天是“改代码—提交训练—等待—看日志—决定下一步”,过程中还经常被打断。我们团队从 Karpathy 的 AutoResearch 出发,经过三次架构重构,搭建出一套可在企业云端训练平台使用的算法研究自进化系统。本文分享这套系统的设计理念、架构演进与可信度设计,希望对大家有所帮助或启发。

美团技术团队 465

SLM 生成式高并发推理引擎:延迟约束下的有效吞吐优化

本文为SLM(Small Language Model, 小参数量语言模型0.5~1B)在搜推场景的大规模落地提供了一套高性能、可复用的工程实践。

美团技术团队 557

MTFM:美团统一推荐基座大模型在外卖多业务场景的落地实践

美团在 MTGR 基础上提出统一推荐基座大模型 MTFM,首次实现外卖多个主要业务的统一精排模型。围绕规模可扩展性、场景可延展性与架构高效性三大挑战,MTFM以异构 Tokenizer 与动态掩码实现多场景特征免对齐,通过混合注意力与 Target Scale-Up 提升模型 Scaling 能力,借鉴 LLM 优化实践提升深层网络训练效果,并以 User-Level 训练范式与定制算子保证系统开销可控。美团外卖多个业务订单量提升 2.06%~6.68% 不等,推理成本降低 24%。

美团技术团队 692

《Agent 评测白皮书》系列01:Agent 评测全览

我们推出了《Agent评测白皮书》系列博客,体系化地为大家讲解评测的落地指南,分为《评测全览》、《冷启动篇》、《扩量篇》、《自进化篇》等共4篇,本文为系列的第一篇。

美团技术团队 664

美团智播——数字人直播技术创新与实践

美团智播,是面向本地生活场景的AI数字人直播解决方案,融合大模型、数字人与多模态交互技术,提供丰富的行业专属数字人形象,支持真人1:1复刻与门店实景定制,30秒生成直播素材,3分钟完成开播配置,7×24小时稳定上播。过去一年,依托生成式AI技术,数字人直播月日均GTV同比增长82.12%,月日均观看人次同比增长163.44%,开播场次提升11倍,充分验证了AI数字人直播在本地生活商业闭环中的实际价值。

美团技术团队 907

GeoRA: 为RLVR设计的LoRA——ACL 2026杰出论文解析

本文介绍了一种专为 RLVR 设计的低秩训练方法,以及它在业务 Agentic RL 中的落地经验。

美团技术团队 675

美团搜索3.0:LLM 语义表征在排序模型的探索与应用

美团搜索团队正依托团垂融合新架构与生成式大模型新技术,全面重构本地生活搜索底座。本系列技术博客将持续介绍美团搜索 3.0 的技术探索,本文聚焦 LLM 语义表征在服务零售排序场景上的三期实践——从单点特征验证到系统性表征体系构建,再到跨场景迁移复用,探索语义匹配信号在搜索排序中的应用路径。

美团技术团队 910

KDD‘26 美团学术论文精选及KDD Cup‘26 DataAgents赛道冠军思路解读

本文精选了美团技术团队被 KDD 2026 收录的 8 篇论文进行分享,这些论文覆盖了推荐大模型、生成与奖励建模框架、智能体搜索、Transformer 框架、元泛化框架等技术领域。

美团技术团队 956

Agent评测漫谈 —— 由浅入深讲解Agent评测

本篇博客是一篇科普文章,由浅入深的介绍Agent评测。其中前两章系统介绍了评测是什么,以及如何建立评测体系;其中第二章是美团图灵Agent评测团队深入美团各业务团队BP总结出的实践经验,是我们在两年实践过程中逐步打磨出来的认知。第三章重点介绍了龙虾/爱马仕这类长程Agent框架的出现对评测带来的变化。

美团技术团队 1068

美团正式发布 CatPaw:全场景 AI Agent,从个人提效到企业智能化

搭载 LongCat 2.0 的美团全场景 AI Agent 平台 CatPaw 正式上线,将模型能力从“跑得动”推向“用得好”。CatPaw 提供开箱即用的 AI 智能工作台与企业级 Agent 开发托管能力。

美团技术团队 1015

让AI离开温室,走向动态世界:MineExplorer揭示顶级多模态大模型被忽视的能力断层

美团 LongCat 团队构建了MineExplorer——首个在开放世界中做到分钟级长程任务的评测基准,系统性地评测多模态大模型在需要长程规划、并包含隐藏前置条件的任务中的真实能力。

美团技术团队 864

下一代搜索智能体评测基准!美团开源LoHoSearch,用知识图谱校准AI能力认知

过去一年,我们见证了 Search Agent 能力的显著演进。在 BrowseComp 等评测上,顶尖模型准确率从最初的30%区间迅速攀升至90%以上。然而,当基准迅速饱和,其区分模型能力的价值也随之递减。

美团技术团队 910

直播回放·含 ACL‘26 杰出论文 | 美团 AI 顶会论文 32 篇精讲

2026 年,美团技术团队数十篇论文被 ACL、SIGIR、ICML、KDD 等顶会收录。我们精选 32 篇,进行了 5 大专场直播。

美团技术团队 898

正式开源!美团 LongCat-2.0 同步开放国产卡推理代码

美团 LongCat-2.0 总参数 1.6T,平均激活约 48B,为真实的 Agentic Coding 任务而生,架构上创新性引入 LongCat 稀疏注意力和 N-gram Embedding,提升长上下文处理效率与 Token 级表示能力的同时,结合动态激活进一步强化了代码理解、生成以及执行的表现。

美团技术团队 864

美团 LongCat-2.0 正式发布:在国产算力集群上完成全流程训练与推理的万亿参数模型

6月30日,美团正式发布新一代万亿参数大模型 LongCat-2.0,并将对外开源。

美团技术团队 1212

LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆

VitaBench 2.0 是首个真实生活场景下面向长期动态用户建模的智能体评测基准,它系统性地评测大语言模型在长期、真实、动态的用户互动中个性化与主动性的能力

美团技术团队 1116

ICML 2026 | 美团技术团队学术论文精选

ICML(International Conference on Machine Learning,国际机器学习大会)是机器学习领域最具影响力的国际顶级学术会议之一。

美团技术团队 850

美团海报生成 AIGC 技术创新与实践

美团智能创作团队围绕海报生成 AIGC 构建了完整技术体系,打造「生成-编辑-评判」技术闭环,目前已在美团外卖、品牌 IP 等场景落地,已全部开源。

美团技术团队 2060

从月球漫步到赛博都市,WBench 测出了世界模型的边界

美团 LongCat 团队提出了 WBench,它是首个面向交互式视频世界模型的系统性多轮评测基准。它就像一台“CT扫描仪”,能精准定位当前世界模型在从“被动观看”到“主动交互”的过程中,到底卡在了哪里。

美团技术团队 1243

报名|ACL‘26 美团中稿精选:从能力评测到推理优化,构建生成新范式

本文分享了美团技术团队被 ACL 顶会收录的其中 6 篇论文,技术方向覆盖大模型评测、复杂流程推理、竞赛级数学思维优化、强化学习优化、生成式推荐等领域。

美团技术团队 1515

从高拟真到真可用,LongCat-Video-Avatar 1.5 正式开源

LongCat-Video-Avatar 1.5 即便在复杂商业场景里,也能稳定、自然地输出高质量内容,让数字人视频生成从彩排室的完美演练,走向千人千面的真实舞台。

美团技术团队 1587

美团跑腿 Skill:一句话,骑手来帮忙

美团跑腿 Skill 支持所有 Claw 客户端,包括 OpenClaw 本地版、火山引擎等云部署版、QClaw 等第三方客户端。

美团技术团队 1857

美团 LongCat 开源 General 365:树立推理评测新标尺

General 365 将推理评测从专业知识依赖中剥离出来,让我们直观地看到了大模型在真实世界的通用推理任务上的短板。

美团技术团队 2082

用Agent评测思路管理AI Coding —— 31万行代码AI重构的实践

当团队 90% 以上的代码由 AI 生成,31 万行的复杂业务系统还在高速膨胀,你会发现一个反直觉的事实:AI Coding 不会自动收敛复杂度 —— 没有统一规范的约束,不同人用 AI 写出的代码风格各异,系统反而会加速腐化。本文记录了我们如何在不停止业务交付的前提下,完成这场重构。

美团技术团队 2427

LARYBench 发布:定义具身动作表征 ImageNet,首次度量从人类视频学习的泛化表征

LARYBench (Latent Action Representation Yielding Benchmark),一个指引从大规模的视觉数据学习到通用的隐式动作表征的系统化评测基准。实验结果表明:在动作泛化和控制精度上,通用视觉模型的表现均显著优于专门为具身智能设计的动作专家模型,具身动作表征可以从大规模人类视频数据中涌现。

美团技术团队 2201

突破零样本TTS音色克隆上限:LongCat-AudioDiT 的声音克隆艺术

能不能让 AI 直接学会声音本身的规律,跳过中间环节?为破解这一技术瓶颈,美团 LongCat 团队正式发布 LongCat-AudioDiT。在该模型中,我们彻底抛弃梅尔谱等中间表示,直接在波形潜空间进行基于扩散模型的文本转语音(Text-to-Speech, TTS),从根源阻断数据转换的级联误差。

美团技术团队 1599

LongCat-Flash-Prover:AI 攻克数学定理证明,不仅要“算得对”,更要“证得严”

如何让 AI 从“猜答案”走向“严谨证明”,成为复杂推理具有挑战的课题。我们开源了专门用于数学形式化与定理证明的模型 —— LongCat-Flash-Prover。

美团技术团队 1801
上一篇: 深入理解函数式编程(下)
下一篇: 深入理解函数式编程(上)
美团技术团队
美团技术团队 企业官方账号 企业官方账号
博客等级 码龄10年 3万+粉丝 754原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值