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

golang 是函数式语言吗?

  •  
  •   alangz ·
    xyalan · 2015-04-23 11:00:51 +08:00 · 2525 次点击
    这是一个创建于 3536 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    Haskell Erlang不属于以上系别

    好像是这样分的
    zhyu
        5
    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
    mingzhi
        7
    mingzhi  
       2015-04-23 11:41:15 +08:00
    @zhyu 你意思是 rust也算函数式?
    zhyu
        8
    zhyu  
       2015-04-23 11:54:58 +08:00 via iPhone
    @mingzhi 我的意思是函数式不那么分系别的… 一般只分纯不纯
    xua131988
        9
    xua131988  
       2015-04-23 12:00:53 +08:00
    绝对不是

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

    這個理解稍有偏差。

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

    沒有副作用或者說沒有中間狀態是 _純_ 函數式語言的特徵,像 JavaScript,Python 這樣支持函數式範式的語言當然有副作用。
    notcome
        11
    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
        12
    windyboy  
       2015-04-23 16:50:35 +08:00
    scala 是语言
    scala play 是full stack framework
    两件事
    njutree
        13
    njutree  
       2015-04-23 17:18:23 +08:00 via iPhone
    应该是过程式,函数式的概念很极端的
    hooluupog
        14
    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
        15
    hhkbp2  
       2015-04-23 23:46:42 +08:00
    不是,go是命令式
    tangplin
        16
    tangplin  
       2015-07-21 14:20:58 +08:00
    Swift 和 Rust 类似,也可以算是函数式语言.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3927 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:12 · PVG 13:12 · LAX 21:12 · JFK 00:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.