V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
szzhiyang
V2EX  ›  Go 编程语言

Go 适合做函数式编程吗?

  •  
  •   szzhiyang · 2020-04-24 19:49:12 +08:00 · 4960 次点击
    这是一个创建于 1454 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Go 官方说挺适合的,我想听听大家的见解。


    28 条回复    2020-04-25 22:57:13 +08:00
    zhuangzhuang1988
        1
    zhuangzhuang1988  
       2020-04-24 19:54:56 +08:00   ❤️ 1
    搞牛逼技术吧, FP 就是放屁,
    Mohanson
        2
    Mohanson  
       2020-04-24 20:02:08 +08:00 via Android
    之前看一个 wasm 虚拟机,4000 行代码,只有函数没有任何 class, 当时觉得真难阅读啊草,几个月后去看已经重构了。

    这个项目是 eth2.0 虚拟机 py 版本,因为它叫 py-wasm, 和我的 pywasm 就差一个横杆所以特别关注过。

    我觉得面向对象是邪说,函数式是歪理,只有 c 的过程式才是永恒的… 别打我。
    dandycheung
        3
    dandycheung  
       2020-04-24 20:05:47 +08:00 via iPhone
    @Mohanson 面向对象并非歪理邪说,它是基于过程式的实践发展出来的。只是主要应用场景不同。不同规模的问题需要对应不同的技术手段。
    Mohanson
        4
    Mohanson  
       2020-04-24 20:07:13 +08:00 via Android
    @dandycheung 同意的,适用场景不同
    cmdOptionKana
        5
    cmdOptionKana  
       2020-04-24 20:09:23 +08:00
    @szzhiyang 在你给出的链接里,并没有说 “挺适合”。而且,开篇就非常清晰地列举了 Go 具体支持函数式编程之中的哪几个特性。

    也就是说,支持程度已经非常清晰了。
    pisc
        6
    pisc  
       2020-04-24 20:24:30 +08:00 via Android
    不适合,别搞。
    pisc
        7
    pisc  
       2020-04-24 20:43:45 +08:00 via Android   ❤️ 4
    @zhuangzhuang1988 大哥你要不要搞个 PL 的博士再来大放厥词
    xcstream
        8
    xcstream  
       2020-04-24 20:47:27 +08:00
    不适合,别搞。
    cpu 指令就是过程式的
    wellsc
        9
    wellsc  
       2020-04-24 20:53:11 +08:00
    不适合
    TransAM
        10
    TransAM  
       2020-04-24 21:22:31 +08:00 via Android
    任何支持一等函数的语言都适合。
    nguoidiqua
        11
    nguoidiqua  
       2020-04-24 21:24:08 +08:00 via Android   ❤️ 1
    golang 适合,但不知道你适不适合。
    yuk1no
        12
    yuk1no  
       2020-04-24 21:29:59 +08:00 via iPhone
    不适合,FP 基础设施不够
    szzhiyang
        13
    szzhiyang  
    OP
       2020-04-24 21:44:37 +08:00
    @cmdOptionKana
    @wellsc
    @yuk1no
    @pisc
    @xcstream

    请问 Go 缺少了哪些函数式编程的特性和基础设施使得它不适合做函数式编程?
    szzhiyang
        14
    szzhiyang  
    OP
       2020-04-24 21:45:38 +08:00
    @nguoidiqua 我适合。
    FireFoxAhri
        15
    FireFoxAhri  
       2020-04-24 21:55:25 +08:00   ❤️ 1
    golang 新手,Scala/Java 开发。我觉得 Go 的基础的数据结构似乎都没有支持 map filter reduce fold 这类操作,而且写代码的时候似乎也是指令式的,一般使用变量。而写 Scala 的时候基本可以做到不使用 var 了,集合操作都用标准库提供的 map fold 来完成,不使用 while
    CosimoZi
        16
    CosimoZi  
       2020-04-24 22:04:24 +08:00 via Android
    typeclass monad
    ConradG
        17
    ConradG  
       2020-04-24 22:17:20 +08:00   ❤️ 1
    支持函数指针 /高阶函数的理论上都能做 FP,无非方便程度的差距
    golang 写 fp 的短板主要是它是强类型语言但类型系统又不够强。这本身也并不阻碍做 fp,但是别的 fp 语言或者有泛型,或者有类型推断,或者有偏特化,相比下 go 就显得不那么适合了。
    reus
        18
    reus  
       2020-04-24 22:49:42 +08:00
    挺好的,记得用 reflect 。
    yukiloh
        19
    yukiloh  
       2020-04-24 22:58:32 +08:00 via Android
    if nil…………
    pisc
        20
    pisc  
       2020-04-24 23:57:49 +08:00 via Android   ❤️ 2
    @szzhiyang 不要看它支持 first-class function 就说它很“FP”,它支持这个是因为这是一个很基础、有用且重要的 feature 罢了,在 go 的设计里,很多都是反 FP 的理念和设计的,你不信的话你把主流 FP 语言( ML 、Haskell 、Scheme )一些常见的代码试图用 go 来实现你就知道了,主流的 FP 语言都会很强调可组合性,能这么做的前提是要么有灵活的动态类型系统、要么有强大的静态类型系统,go 的静态类型系统太弱鸡了,实现起来很费劲,比如 filter/map/fold 等等(这些只是小例子,很有很多更复杂的)在 FP 很容易实现,在 go 里就很鸡毛,“gopher”们会告诉你 for 一把梭,另外比如像
    @reus 会告诉用 reflect,然而 reflect 是金手指两面刀肥猪拱墙,本质就是用动态类型的方式解决弱鸡的静态类型系统。

    总而言之,不合适,不搭,别搞。

    要玩 FP 就老老实实在主流 FP 里玩,小清新就玩 Scheme 、要血统就玩 SML 、要逼格玩 Haskell 、要振兴 type theory 就玩 Coq/Agda 。
    ica10888
        21
    ica10888  
       2020-04-25 00:13:32 +08:00 via Android
    没有 arrow function,写起来难受。没有泛型,没法类型推断,高阶函数每次用的时候都写一次类型?map 和 slice 我都不知道怎么来支持 map/filter/fold...
    optional
        22
    optional  
       2020-04-25 00:14:08 +08:00 via iPhone
    @szzhiyang 泛型,类型推断
    szzhiyang
        23
    szzhiyang  
    OP
       2020-04-25 00:21:51 +08:00
    @ConradG
    @pisc
    @FireFoxAhri

    感谢你们。感觉你们都认为是 Go 泛型的缺失使其不适合函数式编程,那等 Go 支持泛型后它应该就能适合了吧?
    pisc
        25
    pisc  
       2020-04-25 08:44:38 +08:00 via Android
    @szzhiyang 你没理解我的话,我全文都没提过泛型,参数多态只是一个很基础的东西而已,我说的是设计,go 的很多设计是反 FP 的,就算支持泛型也没办法改变,你要不信你可以去玩玩,如果你觉得还不错,那我只能认为你没怎么写过 FP 代码。
    shadownet
        26
    shadownet  
       2020-04-25 10:44:37 +08:00 via iPhone
    没有肉车 只有肉人 深入研究没什么不可能 有坑填 无轮造
    tairan2006
        27
    tairan2006  
       2020-04-25 21:13:33 +08:00 via Android
    Go 和函数式编程没啥关系吧,你不能说支持 function 就支持函数式编程…楼主你写过 Haskell 么?
    outoftimeerror
        28
    outoftimeerror  
       2020-04-25 22:57:13 +08:00
    为啥一点要搞函数式,我之前写 scala,我最烦同事引用 scalaz 和 cats 这两个库,后面他跑路了代码都没人维护。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4836 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 01:07 · PVG 09:07 · LAX 18:07 · JFK 21:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.