Go 适合做函数式编程吗?

2020-04-24 19:49:12 +08:00
 szzhiyang

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


5084 次点击
所在节点    Go 编程语言
28 条回复
zhuangzhuang1988
2020-04-24 19:54:56 +08:00
搞牛逼技术吧, FP 就是放屁,
Mohanson
2020-04-24 20:02:08 +08:00
之前看一个 wasm 虚拟机,4000 行代码,只有函数没有任何 class, 当时觉得真难阅读啊草,几个月后去看已经重构了。

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

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

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

请问 Go 缺少了哪些函数式编程的特性和基础设施使得它不适合做函数式编程?
szzhiyang
2020-04-24 21:45:38 +08:00
@nguoidiqua 我适合。
FireFoxAhri
2020-04-24 21:55:25 +08:00
golang 新手,Scala/Java 开发。我觉得 Go 的基础的数据结构似乎都没有支持 map filter reduce fold 这类操作,而且写代码的时候似乎也是指令式的,一般使用变量。而写 Scala 的时候基本可以做到不使用 var 了,集合操作都用标准库提供的 map fold 来完成,不使用 while
CosimoZi
2020-04-24 22:04:24 +08:00
typeclass monad
ConradG
2020-04-24 22:17:20 +08:00
支持函数指针 /高阶函数的理论上都能做 FP,无非方便程度的差距
golang 写 fp 的短板主要是它是强类型语言但类型系统又不够强。这本身也并不阻碍做 fp,但是别的 fp 语言或者有泛型,或者有类型推断,或者有偏特化,相比下 go 就显得不那么适合了。
reus
2020-04-24 22:49:42 +08:00
挺好的,记得用 reflect 。
yukiloh
2020-04-24 22:58:32 +08:00
if nil…………
pisc
2020-04-24 23:57:49 +08:00
@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 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/665804

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX