最早用箭头(->或=>)来代表 lambda 表达式/匿名函数的语言是什么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题复制粘贴 AI 生成的内容
yazinnnn0
V2EX    程序员

最早用箭头(->或=>)来代表 lambda 表达式/匿名函数的语言是什么?

  •  
  •   yazinnnn0 2024-01-20 11:31:39 +08:00 9077 次点击
    这是一个创建于 660 天前的主题,其中的信息可能已经有所发展或是发生改变。

    知乎上看到有人说是 csharp, 搜了一下发现 csharp3.0(07 年)才支持这个语法

    32 条回复    2025-10-14 01:13:28 +08:00
    vToExer
        1
    vToExer  
       2024-01-20 11:37:43 +08:00
    在编程语言历史中,代表 Lambda 表达式用箭头符号 "->" 或 "=>" 的确非常常见,但是要找到一个比 Javascript 更早使用的语言,可能要涉及到一些历史悠久的或者不太为现代编程所熟知的语言。在我所获取的信息中,似乎没有比 Javascript 更早采用这种表示方式的编程语言。值得注意的是,这并不代表实际上不存在比 Javascript 更早使用箭头符号的语言,只是这些信息可能无法从当前可获得的资源中找到。
    garipan
        2
    garipan  
       2024-01-20 11:52:54 +08:00
    @vToExer #1 你这个是 3.5 的回答不,看看 4 的回答:

    最早采用箭头(-> 或 =>)来表示 lambda 表达式或匿名函数的语言之一是 ALGOL 68 。ALGOL 68 在 1968 年推出,其中引入了使用箭头 "->" 来表示函数类型。此外,另一种语言是 Miranda ,它在 1980 年代早期被开发,使用了"->"来表示匿名函数或 lambda 表达式。

    然而,值得注意的是,"->" 和 "=>" 这样的表示法在后来的很多其他编程语言中变得更加流行,特别是在函数式编程语言中,比如 Haskell (使用 ->)和 Scala (使用 =>)等。这种表示法现在在许多现代语言中普遍存在,用于表示匿名函数或 lambda 表达式。
    Bromine0x23
        3
    Bromine0x23  
       2024-01-20 12:00:38 +08:00
    可能是某种函数式语言
    shyangs
        4
    shyangs  
       2024-01-20 12:02:32 +08:00   7
    @garipan

    ALGOL 68 和 Miranda 根本有箭函.

    你的 ChatGPT4 比 ChatGPT3.5 胡八道. ChatGPT 3.5 至少不知道.
    garipan
        5
    garipan  
       2024-01-20 12:07:33 +08:00
    @shyangs #4 哈哈 这其实正是我想表达的 AI 回答不靠谱
    Bromine0x23
        6
    Bromine0x23  
       2024-01-20 12:08:08 +08:00
    查了下 1973 年的 ML 语言就有用 => 了
    kneo
        7
    kneo  
       2024-01-20 12:09:59 +08:00 via Android   17
    不懂别答。贴这些破玩意干什么。
    zxkmm
        8
    zxkmm  
       2024-01-20 12:13:37 +08:00   2
    @vToExer 您好,为什么要用 AI 回答来污染论坛?
    更不用说这句车轱辘话根本没有提供有价值信息
    taotaodaddy
        9
    taotaodaddy  
       2024-01-20 12:16:27 +08:00
    我这边不联网的 GPT4 也没有乱讲

    而联网的 gpt4 回答的是:

    这个箭头(lambda 或者箭头函数)的表示法最早在 C#语言中出现。随后,Javascript 在 ES6 版本中借鉴了这个语法,用于表示匿名函数和 lambda 表达式。其实这种语法简化了函数的声明,使代码更加精简,也更容易阅读。
    ssz66666
        10
    ssz66666  
       2024-01-20 12:25:01 +08:00 via Android
    可能是(Standard) ML 吧
    geelaw
        11
    geelaw  
       2024-01-20 12:33:06 +08:00   1
    从渊源来说这个符号来自于 \mapsto ,初次引入应该是 Bourbaki 著《积分》第一章到第四章的部分,见 https://hsm.stackexchange.com/a/5777 翻了一下,第 13 页有

    Corollaire. On suppose que M(1) = 1 ; alors, pour toute fonction numérique finie f, définie dans X, l'application p N_p(f) est croissante dans ]0, +∞[.

    如果要找可以机器执行的语言(“编程语言”)则比较困难,一个思路是先找支持 anonymous function 的语言,然后一个一个查看它是否有、何时引入了箭头记号。
    vToExer
        12
    vToExer  
       2024-01-20 13:40:12 +08:00
    @kneo @zxkmm 查了一下确实 Javascript 是正式在 2015 年 ES6 引入箭头符号,并非最早的。撤回我之前的回复。

    是我不懂装懂,盲目相信了 AI 结论,没有仔细求证,浪费了各位 v 友的时间,非常抱歉。
    ladudu
        13
    ladudu  
       2024-01-20 13:41:03 +08:00
    @garipan #2 加钱就是不一样
    jgh004
        14
    jgh004  
       2024-01-20 13:46:53 +08:00
    @ladudu 兄弟看着有点眼熟啊
    Leviathann
        15
    Leviathann  
       2024-01-20 14:07:38 +08:00   6
    http://dobegin.com/lambda-functions-everywhere/

    Lambda function syntax in programming languages
    Language Lambda syntax Ver Year
    Haskell \x -> 2*x+1 1 1990
    Python lambda x: 2*x+1 1 1994
    OCaml/F# fun x -> 2*x+1 1 1996
    Scala x => 2*x+1 1 2004(2)
    C# x => 2*x+1 3 2007(6)
    Ruby -> (x) { 2*x+1 } 1.9 2007(1)
    Groovy { x -> 2*x+1 } 1 2007(2)
    Visual Basic Function (x) 2*x+1 9 2007
    PHP function ($x) { return 2*$x+1; } 5.3 2009
    Objective-C ^(int x) { return 2*x+1; } 3.2 2009(3)
    Clojure (fn [x] (+ (* 2 x) 1)) 1 2009(2)
    C++ [](int x) { return 2*x+1; } 11 2011
    Go func (x int) int { return 2*x+1 } 1 2012(2)
    Java x -> 2*x+1 8 2014
    Swift { x in 2*x+1 } 1 2014
    Javascript x => 2*x+1 6 2015(4)
    Perl -> $x { 2*$x+1 } 6 2015(5)

    知乎上 C#那帮人一股子饭圈味
    agagega
        16
    agagega  
       2024-01-20 14:16:35 +08:00   3
    知乎上很大一部分微软粉丝,吹的并不是微软的东西有多好用,功能多强大,设计多精致,而是乐于将微软那些没有流行的技术或产品,当作代入他们怀才不遇心态的对象。

    总之就是 C#没火,Silverlight 没火,ASP 没火,Windows Server 没火,Edge 换 Chromium ,都不是微软的问题,都是市场有问题,都是用户年纪小没有 taste跟他们讨厌的果粉一个样
    Alias4ck
        17
    Alias4ck  
       2024-01-20 14:59:59 +08:00
    @Leviathann 我Haskell
    chenqh
        18
    chenqh  
       2024-01-20 15:18:05 +08:00
    @agagega 本身就是技术没问题啊,不然为什么 js 这种 SB 语言会火呢,因为游览器只支持 JS 啊,如果 JS 那么好,为什么 nodejs 在后台开发上不怎么火呢
    cpstar
        19
    cpstar  
       2024-01-20 15:22:40 +08:00
    以我浅显对这东西的理解,这东西能不能叫“函数表达式”“函数简式”之类的,单看“拉姆达表达式”不知所云。
    cnbatch
        20
    cnbatch  
       2024-01-20 15:40:13 +08:00
    @cpstar 它本身就有另一个称呼,叫做“匿名函数”。

    之所以会叫作“lambda 表达式”,是因为最早期的“匿名函数”出现在 LISP ,但 LISP 并不使用箭头来表达,而是使用关键字 lambda 。

    https://en.wikipedia.org/wiki/Anonymous_function
    https://zh.wikipedia.org/zh-cn/%E5%8C%BF%E5%90%8D%E5%87%BD%E6%95%B0
    https://www.geeksforgeeks.org/lambda-functions-in-lisp/

    于是计算机学界把“匿名函数”叫作“lambda 表达式”已经有几十年的习惯了。

    可以这么说,“匿名函数”其实很早就已经出现在编程语言当中,但使用箭头来表示匿名函数的做法,已经是很后期的时期了(#15 提供的列表)。
    nagisaushio
        21
    nagisaushio  
       2024-01-20 15:46:13 +08:00 via Android
    @cnbatch lambda 表达式的叫法我觉得要归因于 lambda caculus ,而不是 Lisp 。
    Uanti
        22
    Uanti  
       2024-01-20 16:38:41 +08:00
    你这问题应该去 emacs china 问
    jonty
        23
    jonty  
       2024-01-20 16:54:53 +08:00
    @garipan #2 号要没了
    ychost
        24
    ychost  
       2024-01-20 19:17:14 +08:00
    我接触过的语言确实是 C# 最早,还有 async/await 、properties 均是来自 C#,不过我现在更喜欢 kotlin/groovy/dart 那种闭包写法,简单点
    ladudu
        25
    ladudu  
       2024-01-20 20:02:48 +08:00
    @jgh004 #14 哈哈哈哈
    superedlimited
        26
    superedlimited  
       2024-01-20 21:19:23 +08:00 via iPhone
    不管谁是第一个使用的,但 js 的写法是最爽的。
    june4
        27
    june4  
       2024-01-20 21:46:28 +08:00
    @superedlimited js 的"->"爽大部分来自于 function 这个单词过于长了
    kneo
        28
    kneo  
       2024-01-21 12:51:37 +08:00 via Android
    @nagisaushio 你这么说也没错。但我觉得如果没有 lisp ,也许永远不会有人管这个叫 lambda 。也就就叫管它叫匿名函数,甚至函数。
    msg7086
        29
    msg7086  
       2024-01-22 04:58:22 +08:00 via Android
    @vToExer hhh 其实 Javascript 的箭头应该是从 CoffeeScript 借鉴的。
    mind3x
        30
    mind3x  
       2024-01-22 07:21:00 +08:00 via Android
    @kneo

    @nagisaushio 说的是正解。Lambda 演算(Lambda Calculus)早在 1930 年代就提出来了,比现代电子计算机出现早几十年。
    drymonfidelia
        31
    drymonfidelia  
       2024-01-23 16:30:28 +08:00
    @Livid 1 楼 2 楼 AI 回复还是错的
    wittyfans
        32
    wittyfans  
       28 天前 via iPad
    最近学到 lambda 演算,这东西很早就提出来了,比如

    TRUE := λa.λb. a
    FALSE := λa.λb. b
    AND := λp.λq. p q FALSE
    OR := λp.λq. p TRUE q


    从理论上来说,任何可以用 Lambda 演算定义的函数,都可以由一台图灵机来计算;反之,任何可以由图灵机计算的函数,也都可以用一个 Lambda 表达式来定义。这一等价性证明是理论计算机科学的奠基石。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2302 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 123ms UTC 00:02 PVG 08:02 LAX 16:02 JFK 19:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86