V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yocoso
V2EX  ›  Haskell

Haskell 这门语言怎么样?

  •  1
     
  •   yocoso · 2016-06-03 06:51:05 +08:00 · 10277 次点击
    这是一个创建于 3128 天前的主题,其中的信息可能已经有所发展或是发生改变。

    首先我知道,它很小众。

    然后很多人都说,它的函数式编程方式是很值得学习的,哪怕你不用这门语言,它给你编程思维方式的启迪是很大的。 公司有人组织一起学习 haskell, 想知道,它是否值得我付出时间。

    因为时间有限,如果花时间参与学习 haskell ,必须放下另一些有价值的学习.

    我的主编程语言是 javascript ,同样是函数式编程, haskell 给我带来多大的思维转变?

    我也不打算以后靠 haskell 换工作。 javascript 是我将一直坚持的语言。

    不知道 haskell 能给我带来的收获是否需要参与一个需要每周有 commitment 学习小组来实现?

    第 1 条附言  ·  2016-06-04 06:24:12 +08:00
    BTW, 我之前学过 scheme ,不知道 scheme 和 haskell 具有可比性吗?
    从 scheme 中,我只是觉得编程的思维方式换了,并没有觉得对我的编程能力抽象能力有什么提高。
    17 条回复    2016-06-15 21:06:52 +08:00
    McContax
        1
    McContax  
       2016-06-03 07:29:23 +08:00 via Android
    mark , js 学习 ing ,感觉有点吃力
    Andiry
        2
    Andiry  
       2016-06-03 08:04:33 +08:00
    可以一行代码实现快排。
    除此之外,没看出来有什么鸟用。
    YuJianrong
        3
    YuJianrong  
       2016-06-03 08:39:59 +08:00 via iPhone
    没学过 haskell 学过同为函数式的 lisp 。要说对我的 js 水平没有用那肯定不客观!起码有……大概…… 1%?

    虽然并不后悔,不过 lisp 之后我就不想学函数式语言了,知道一门已经够了。
    EPr2hh6LADQWqRVH
        4
    EPr2hh6LADQWqRVH  
       2016-06-03 08:47:42 +08:00
    Haskell 里面概念多,虽然 JavaScript 也算是函数语言,但并没包含多少函数编程概念,以至于还要引入 lodash 这种东西才能写得稍微函数
    levn
        5
    levn  
       2016-06-03 09:12:27 +08:00
    不要学了
    fcicq
        6
    fcicq  
       2016-06-03 09:18:15 +08:00
    说 Haskell 必须提 Monad 啊. 初学肯定绕但明白之后应该会发现不算难. 只是讲的好的教程少吧.
    zhangyi2099
        7
    zhangyi2099  
       2016-06-03 10:07:28 +08:00 via iPhone
    我就知道了个偏函数
    jiyinyiyong
        8
    jiyinyiyong  
       2016-06-03 10:26:10 +08:00
    加 Haskell 微信群请先加我微信 jiyinyiyong 我帮你拉进去.. 注明一下加 Haskell 群免得我拉错群..

    公司有人带这个算很幸运了, 自己学, 一个人学, Haskell 的难度比其他的语言都大
    如果想深入理解编程, JavaScript 是问题非常多的语言, 会导致你很多的错误理解
    虽然能用 JavaScript 写各种东西, 但是高层次的编程抽象在 JavaScript 里很难做
    Haskell 作为研究方向的语言, 很多特性做得非常极端, 甚至影响到正常开发的使用
    比如说数据的不可变性, 不可为 null, 还有对副作用的隔离, 会给你很不一样的理解
    JavaScript 这种语言问题多多, 语言特性变来变去, 还一直扒各种语言的功能,
    作为工业上优秀的语言未必是能帮助你正确理解程序而且可能带个你一些误解, 亲身经历
    ...当然你学 Haskell 的话一般是别打算用它找到工作, 门槛太高一般人学不到那个程度
    anubiskong
        9
    anubiskong  
       2016-06-03 11:07:08 +08:00
    @jiyinyiyong 借个机会请教一下, 你所说的"高层次的抽象"是指什么?
    jiyinyiyong
        10
    jiyinyiyong  
       2016-06-03 11:41:51 +08:00   ❤️ 2
    @anubiskong 客气了, 我学到点皮毛, 深入的要看知乎上有些 Haskell 的阐述,
    我是在前端这边跟进函数式方案写 UI 的套路的, 这边带来的抽象改变很大,

    以往我们写程序就是写一堆状态, 然后想怎么操作, 再想到把复用的过程合并到一起, 再把特定的界面抽象为对象称为组件, 然后组件之间相互作用抽象为消息, 这样一个套路构建一套前端 MVC 方案处理, 比如说 Backbone.

    到了函数式编程整个思维还在改变, 引入了不可变数据. 因为用对象化的方式思考问题常常带来很多组件的局部状态, 状态多了组件之间的消息通讯也很复杂, 最终不敢随便扩大规模. 但是函数式的思路是引入不可变数据(消耗性能和计算量为对价), 把 MVC 的 Model 抽象为一个整体随时间更新, 把 View 部分整个用 DSL 抽象一遍, 也就是 React 那边发生的组件化开发跟性能优化的事情.

    因为在函数式编程当中数据不可变性(以及对副作用的限制), 函数复用的可靠性相比不做限制的语言大大增强, 可以做更复杂的复用和抽象. 特定在前端的话, JavaScript 除了可变的数据结构, 还有 this 之类很多奇怪的问题影响到复杂的抽象过程, 可靠性上有点问题, 虽然功力够的话写大型软件也不是不可以. 结果就是在 Elm 和 React 这样的方案中相对容易去做 DOM 操作的合并, 做运行时的代码替换, 做 Time travel debugging, 做组件化, 而其他方案相对复杂一些. 术语方面可能不严谨, 但应该表达清楚.

    在 Haskell 里边的话还有类型类,并发,副作用之类的抽象, 我说不上来.
    ChefIsAwesome
        11
    ChefIsAwesome  
       2016-06-03 11:49:11 +08:00
    你要是搞前端,就去学学 elm 。函数式编程的关键是写 pure function , js 少了很多语言级别的特性,做不到的。
    yocoso
        12
    yocoso  
    OP
       2016-06-04 02:22:03 +08:00
    @jiyinyiyong 看你所述,学习 haskell 似乎有助于理解现在这些 js 框架的底层实现。如果这样,必须是一门值得学习的语言。不过,需要多少付出才能领悟到这些精髓?
    YuJianrong
        13
    YuJianrong  
       2016-06-04 10:30:10 +08:00 via iPhone   ❤️ 1
    @ChefIsAwesome js 重要的是多了一些特性,才无法做到 pure function 。比如全局变量和 this 的出现导致函数无法避免副作用,这和纯函数式语言区别很大。

    @yocoso 我觉得任何一门纯函数式语言都可以帮助你理解这些框架的实现。比如 lisp 就不错。
    jiyinyiyong
        14
    jiyinyiyong  
       2016-06-04 11:27:53 +08:00
    @yocoso 这么说不准确, Haskell 对于理解 JavaScript 底层没有多大关系, 底层主要是操作系统和编译原理, 实际开发图形应用主要面对的反而不是这种基础技术. 但 Haskell 确实能帮助理解编程的抽象方式, 理解 JavaScript 哪些地方是有问题的, 还有在 React 等函数式方案中的使用方式.

    付出多少么... 很难说, 按我的经验是一边 React 一边 Haskell Clojure 折腾了一年多才觉得有比较好的理解. 后面资料多一点是会好一些. 毕竟要转变观念, 进程还是挺慢的.
    jiyinyiyong
        15
    jiyinyiyong  
       2016-06-04 11:37:54 +08:00   ❤️ 1
    Scheme 的发明时间是 1983 年左右, Haskell 是在 1991 左右, 其实 Scheme 语言特性上类似脚本语言比较宽松的, 相比而言 Scheme 没有 Haskell 的数据不可变性, 没有代数类型系统, 对副作用没有抽象, 虽然对于尾递归很函数复用方面已经做得很好, 细节上还是有差距, 不过后面两点跟删除开发确实有点太遥远. 我觉得可以拿 Clojure 类比一下, Clojure 跟 Scheme 差不多但是多了数据不可变性, 也就是不能通过 `set!` 修改已经定义变量或者修改复合的数据结构, 对于可靠性有提升. 当然把 Scheme 掌握了我是觉得对付 JavaScript 是足够了, 如果不写 React 的话.
    yzlin
        16
    yzlin  
       2016-06-05 15:20:42 +08:00
    @ChefIsAwesome 去 ELM 一打开 0.17 的 What' new ,吓得差点把眼镜从鼻子上震下来
    hwsdien
        17
    hwsdien  
       2016-06-15 21:06:52 +08:00
    很值得学,不认真学真的学不会。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4512 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:06 · PVG 18:06 · LAX 02:06 · JFK 05:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.