之前看一个 wasm 虚拟机,4000 行代码,只有函数没有任何 class, 当时觉得真难阅读啊草,几个月后去看已经重构了。
这个项目是 eth2.0 虚拟机 py 版本,因为它叫 py-wasm, 和我的 pywasm 就差一个横杆所以特别关注过。
我觉得面向对象是邪说,函数式是歪理,只有 c 的过程式才是永恒的… 别打我。
面向对象并非歪理邪说,它是基于过程式的实践发展出来的。只是主要应用场景不同。不同规模的问题需要对应不同的技术手段。
同意的,适用场景不同
在你给出的链接里,并没有说 “挺适合”。而且,开篇就非常清晰地列举了 Go 具体支持函数式编程之中的哪几个特性。
也就是说,支持程度已经非常清晰了。
不适合,别搞。
大哥你要不要搞个 PL 的博士再来大放厥词
不适合,别搞。
cpu 指令就是过程式的
不适合
任何支持一等函数的语言都适合。
golang 适合,但不知道你适不适合。
不适合,FP 基础设施不够
请问 Go 缺少了哪些函数式编程的特性和基础设施使得它不适合做函数式编程?
我适合。
golang 新手,Scala/Java 开发。我觉得 Go 的基础的数据结构似乎都没有支持 map filter reduce fold 这类操作,而且写代码的时候似乎也是指令式的,一般使用变量。而写 Scala 的时候基本可以做到不使用 var 了,集合操作都用标准库提供的 map fold 来完成,不使用 while
typeclass monad
支持函数指针 /高阶函数的理论上都能做 FP,无非方便程度的差距
golang 写 fp 的短板主要是它是强类型语言但类型系统又不够强。这本身也并不阻碍做 fp,但是别的 fp 语言或者有泛型,或者有类型推断,或者有偏特化,相比下 go 就显得不那么适合了。
挺好的,记得用 reflect 。
if nil…………
不要看它支持 first-class function 就说它很“FP”,它支持这个是因为这是一个很基础、有用且重要的 feature 罢了,在 go 的设计里,很多都是反 FP 的理念和设计的,你不信的话你把主流 FP 语言( ML 、Haskell 、Scheme )一些常见的代码试图用 go 来实现你就知道了,主流的 FP 语言都会很强调可组合性,能这么做的前提是要么有灵活的动态类型系统、要么有强大的静态类型系统,go 的静态类型系统太弱鸡了,实现起来很费劲,比如 filter/map/fold 等等(这些只是小例子,很有很多更复杂的)在 FP 很容易实现,在 go 里就很鸡毛,“gopher”们会告诉你 for 一把梭,另外比如像
会告诉用 reflect,然而 reflect 是金手指两面刀肥猪拱墙,本质就是用动态类型的方式解决弱鸡的静态类型系统。
总而言之,不合适,不搭,别搞。
要玩 FP 就老老实实在主流 FP 里玩,小清新就玩 Scheme 、要血统就玩 SML 、要逼格玩 Haskell 、要振兴 type theory 就玩 Coq/Agda 。
没有 arrow function,写起来难受。没有泛型,没法类型推断,高阶函数每次用的时候都写一次类型?map 和 slice 我都不知道怎么来支持 map/filter/fold…
泛型,类型推断
感谢你们。感觉你们都认为是 Go 泛型的缺失使其不适合函数式编程,那等 Go 支持泛型后它应该就能适合了吧?
你没理解我的话,我全文都没提过泛型,参数多态只是一个很基础的东西而已,我说的是设计,go 的很多设计是反 FP 的,就算支持泛型也没办法改变,你要不信你可以去玩玩,如果你觉得还不错,那我只能认为你没怎么写过 FP 代码。
没有肉车 只有肉人 深入研究没什么不可能 有坑填 无轮造
Go 和函数式编程没啥关系吧,你不能说支持 function 就支持函数式编程…楼主你写过 Haskell 么?
为啥一点要搞函数式,我之前写 scala,我最烦同事引用 scalaz 和 cats 这两个库,后面他跑路了代码都没人维护。
在Golang(Go语言)中进行函数式编程是完全可行的,尽管Go并不是纯粹为函数式编程设计的语言,它融合了过程式和面向对象编程的特性,同时也提供了许多支持函数式编程的特性。
Go语言中的函数是一等公民,这意味着函数可以作为参数传递给其他函数,也可以作为返回值从函数中返回。这一特性为编写高阶函数和组合函数提供了便利,是函数式编程的核心。
此外,Go语言支持匿名函数和闭包,这使得在函数式编程中常用的“将函数作为数据”的编程范式得以实现。闭包还可以捕获并持有其所在作用域的变量,这增加了函数的灵活性和表达能力。
Go语言的切片(slice)和映射(map)等数据结构也支持链式操作和过滤等函数式编程技巧。虽然Go没有内置的map和filter函数,但开发者可以通过组合匿名函数和现有的迭代方法(如for循环)来模拟这些函数式编程中的常见操作。
然而,值得注意的是,Go语言的设计哲学更倾向于简洁和直接,鼓励开发者编写清晰、易读和高效的代码。因此,在Go中进行函数式编程时,应遵循这一原则,避免过度使用复杂的函数式编程技巧而导致代码难以理解和维护。
综上所述,虽然Go不是专门为函数式编程设计的语言,但它提供了足够的支持来编写函数式风格的代码。