golang 是函数式语言吗?

2015-04-23 11:00:51 +08:00
 alangz

有了解一些函数式编程的概念,刚刚开始接触golang。自己是做Java开发的,对函数式编程还是很迷惑,虽然知道lisp、scala是函数式语言。

问题:golang是函数式语言吗?

2393 次点击
所在节点    Go 编程语言
16 条回复
signifox
2015-04-23 11:06:55 +08:00
负责任的告诉你,不是。
推荐Rust或Scala
datou552211
2015-04-23 11:09:19 +08:00
@signifox 为什么是这两个语言。
monnand
2015-04-23 11:15:26 +08:00
函数式语言的最大特征是没有side effect。纯粹的函数式语言是haskell。不太纯的比如lisp。go绝对不是
mingzhi
2015-04-23 11:21:10 +08:00
@signifox Rust 不算函数式吧
函数式又有系别之分
Lisp家族:
LISP Scheme
ML家族 :
OCaml F#

Haskell Erlang不属于以上系别

好像是这样分的
zhyu
2015-04-23 11:35:05 +08:00
@mingzhi
Functional programming languages, especially purely functional ones such as Hope and Rex, have largely been emphasized in academia rather than in commercial software development. However, prominent functional programming languages such as Common Lisp, Scheme,[2][3][4][5] Clojure, Racket,[6] Erlang,[7][8][9] OCaml,[10][11] Haskell,[12][13] and F#[14][15] have been used in industrial and commercial applications by a wide variety of organizations.

http://en.wikipedia.org/wiki/Functional_programming
zhyu
2015-04-23 11:37:47 +08:00
mingzhi
2015-04-23 11:41:15 +08:00
@zhyu 你意思是 rust也算函数式?
zhyu
2015-04-23 11:54:58 +08:00
@mingzhi 我的意思是函数式不那么分系别的… 一般只分纯不纯
xua131988
2015-04-23 12:00:53 +08:00
绝对不是

Golang这B 感觉很难写出具有美感的代码, 吸引我的唯一地方就是, 编译成一个文件丢到服务器就搞定.
java这货, 各种依赖, 一不小心体积就到几百M了
scala那个play尼玛也是几十M
yukirock
2015-04-23 14:37:23 +08:00
@monnand

這個理解稍有偏差。

函數式語言最大的特徵是,函數是一等公民:像其它語言中的變量一樣,函數可以作爲參數傳給其它函數,可以作爲返回值從其它函數返回,可以在其它函數內部聲明。函數式語言依賴函數之間的調用關係組合比較複雜的業務邏輯。

沒有副作用或者說沒有中間狀態是 _純_ 函數式語言的特徵,像 JavaScript,Python 這樣支持函數式範式的語言當然有副作用。
notcome
2015-04-23 16:26:19 +08:00
说广一点,能把函数传的满天飞的都算是函数式编程语言了,JavaScript 啊,C++ 11 啦,都可以算。

狭义一点来看,无非就是按照 Lisp/ML/Haskell 系列来分,允不允许一点副作用(Haskell 不允许,通过 monad,unsafePerformIO 不算),还有是不是惰性求值。此外,有没有类型系统,类型系统有多强也算是一个区别,Lisp 就没有类型系统,Agda 这种语言……dependent type……我是没看下去。

代表的话,Lisp 是 Clojure Scheme Racket 之流比较火;ML 无非是 SML、OCaml、F#,Haskell 系……PureScript 算吗二三三。

至于 Golang,当然不算了。
windyboy
2015-04-23 16:50:35 +08:00
scala 是语言
scala play 是full stack framework
两件事
njutree
2015-04-23 17:18:23 +08:00
应该是过程式,函数式的概念很极端的
hooluupog
2015-04-23 17:18:28 +08:00
不是,而且也不打算往那方面靠拢。
很多FP里面的东西直接拿来往Go里面套也是不行的。
比如一切都是不可变的,一切皆为表达式,DSL,continuation,curry,monad transform,global type inference,patern matching,algebraic type等等等等。Go编译器也没有做尾递优化的打算。

和java最大的不同是Go支持一等函数,Go基于组合而不是面向对象(用type embedding 和interface实现inheritance的效果)。同时Go里面一切都是通过值传递的,这也是和java不同的地方。

Go属于命令式语言。
hhkbp2
2015-04-23 23:46:42 +08:00
不是,go是命令式
tangplin
2015-07-21 14:20:58 +08:00
Swift 和 Rust 类似,也可以算是函数式语言.

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

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

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

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

© 2021 V2EX