OC

Knowledge OS
鹦鹉螺口语

入了纯函数式的大坑,已经完全停不下来了

brambles
brambles 发布于 2015年07月28日
无人欣赏。

最近入了纯函数式的大坑Haskell,然后突然感觉打开了新世界的大门,一切的定义都那么简洁优雅,感觉世界瞬间清晰了,很多问题都迎刃而解了~

共39条回复
楼长 · 回复
q397064399 回复于 2015年07月28日

SICP读完之后发现编程水平并没有提高

现代编程体系基于夫洛伊曼的命令式体系 现代编程中能没有变量吗?

2楼 · 回复
brambles 回复于 2015年07月28日

1楼 @q397064399

我学完了建筑设计以后发现自己在工地上搬砖的水平并没有提高。不管你学了什么,你在一个你没用到的领域扯那根本就没有意义啊……

现在软件工程基本模式早就已经变成了 框架 + 业务逻辑 这种简单的模式了。如果一直填业务逻辑,就会会发现自己学的一切都对“编程水平”没有任何意义。我学过计算机组成(微机原理)、学过编译原理、学过数字/模拟电路、学过操作系统、学过项目管理、需求分析、设计模式、架构设计。

但是如果我只填业务代码,那么我上面学的一切都对我的所谓“编程水平”没有带来任何影响。因为根本用不到啊……

举一个只需要会填业务代码的典型例子,Rails。在Rails社区里面写一个链表都能被称为大神,但是不会链表根本不会影响他们用Rails写网站。

3楼 · 回复
q397064399 回复于 2015年07月28日

2楼 @brambles 术业有专攻 ,之前的回复不是针对你说的, 而是针对那些想学计算机编程 刚刚入门 并想以此找一份工作的人说的, 只是看到你在这里说函数式编程,我忍不住想起那些大神的各种回复

深入理解计算机系统(这本我觉得应该读一下,但绝对不是刚开始) (实际上这本书真没那么神乎 高中知识绝对就可以阅读 原书的标题应该是 一个程序员需要了解的计算机知识)

然后就是SICP 说实话这真的是个大坑 我觉得初学者 应该先学一门面向过程的语言(而不是SICP) 然后了解 一下数据结构 对常见的数据结构有清晰的实现 配套数据结构的算法 能看懂多少是多少 毕竟大部分人不是去设计一个新的算法 而是扩展现有的算法 并将其用到项目中去

学完这些之后然后就可以去学各种面向对象的语言以及相应平台的框架 理解抽象 继承 接口 以及面向对象语言中对数据结构封装的容器

4楼 · 回复
q397064399 回复于 2015年07月28日

2楼 @brambles 另外你后面提到的 应该是一名工程师应该具备的知识

5楼 · 回复
xiaotie 回复于 2015年07月28日

我跳了数学这个更大的坑。业余时间在啃实分析

6楼 · 回复
q397064399 回复于 2015年07月28日

5楼 @xiaotie 我看了你的博客 严格意义上讲 你已经算是领域类算法程序员了 跟我们在框架下搞应用的完全不是一回事

7楼 · 回复
brambles 回复于 2015年07月28日

6楼 @q397064399

然而我还在热衷于造轮子……

8楼 · 回复
brambles 回复于 2015年07月29日

5楼 @xiaotie

TnT ……不知道有没机会跳数学的坑。但是感觉真的挺好玩的

9楼 · 回复
hisense 回复于 2015年07月29日

6楼 @q397064399 你怎么知道xiaotie的博客地址啊? 我也想看看啊!

10楼 · 回复
hisense 回复于 2015年07月29日

5楼 @xiaotie 小铁,不知你的博客地址是? 能让大家开开眼吗?

11楼 · 回复
xiaotie 回复于 2015年07月29日
12楼 · 回复
generalzyq 回复于 2015年07月29日

您多大年龄了?graham建议25岁以上的人不要废太多时间在haskell上了,哈哈哈

13楼 · 回复
brambles 回复于 2015年07月29日

12楼 @generalzyq
93的 /w\

14楼 · 回复
generalzyq 回复于 2015年07月29日

13楼 @brambles 那研究起来确实可以感受到这门语言的优美和简洁

15楼 · 回复
brambles 回复于 2015年07月30日

14楼 @generalzyq 以及跪在了pi演算门前……

16楼 · 回复
wangxl 回复于 2015年07月30日

我也在学 :-)

17楼 · 回复
xiaomada 回复于 2015年08月03日

12楼 @generalzyq graham 说这句话的原文在哪?

18楼 · 回复
iridiumcao 回复于 2015年08月04日

真的?早闻 Haskell 之名,一直没学~

19楼 · 回复
brambles 回复于 2015年08月07日

16楼 @wangxl 有没有感觉特别好玩,特别纯粹~

20楼 · 回复
brambles 回复于 2015年08月07日

18楼 @iridiumcao 嗯,学学也没错。不过我感觉我学着学着去补一段数学,然后完了继续学

21楼 · 回复
wangxl 回复于 2016年01月12日

20楼 @brambles 是的,我发挥中国人超级考试技能,已经把FP101x 拿下来了。在没有故意刷分,最后的一个Lab + 一个Homework 没做的情况下拿了79分

22楼 · 回复
brambles 回复于 2016年01月12日

21楼 @wangxl 我已经可以拿着haskell造各种轮子玩了,比如 lambda 计算器之类的东西。

23楼 · 回复
wangxl 回复于 2016年01月12日

22楼 @brambles 你github多少,我去围观 !! :D :D :D

24楼 · 回复
25楼 · 回复
newguy 回复于 2016年01月13日

我研究生的时候学了函数式语言,导师自己写了一个他自己命名的函数式语言。我们学的就是那个,那个时候还要用他创造的语言扩展他的语言增加新功能。但是工作几年之后完全还给老师了。代码的确很简洁,有些问题就用它来解决就很方便,但是绝大多数的项目都用不到啊。一般都是研究院和牛逼投行,而他们一年招的人都是个位数。倒是有个墨西哥人继续跟他研究这个读完了博士。

26楼 · 回复
brambles 回复于 2016年01月13日

25楼 @newguy 函数式语言用得虽然不多……但是函数式语言的特性则被现在主流那些语言大抄特抄……

27楼 · 回复
hrong 回复于 2016年01月18日

要学的东西太多,如果用不上,真的有必要学么。。。。。。。

28楼 · 回复
vincentzhaorz 回复于 2016年01月18日

1楼 @q397064399

  1. 读完没有提高不代表函数式编程没有用处,或许可能是SICP有点过于抽象和脱离实际应用了。可以试试函数式编程思想这本书,里面介绍的是如何用Java的新特性以及Scala和Clojure来写出更好的Java类的代码,对业务逻辑的改善很有帮助
  2. 函数式编程中不是没有变量而是没有变量的赋值,往深了说是不允许有副作用,这个对现代体系结构的影响有好有坏。坏处当然是很难写出偏底层的代码了,好处在并行编程上会减少程序员很多的心智负担。不过这两点还是见仁见智吧,前者其实本来是编译器的任务,后者也看不同人的编程风格。
29楼 · 回复
brambles 回复于 2016年01月18日

27楼 @hrong

打个比方,你见到一个程序员每天跑步,然后你问人家:你又不是体育运动员,你工作也用不到跑步,你真的有必要天天跑步吗?

别人跑步不是因为人家工作需要用到跑步,而是

  1. 人家喜欢跑步
  2. 人家需要用到的是跑步所带来的成果——一个健壮的身体,良好的体魄。

为什么现在那么多大公司找普通码农也那么在乎算法?不是因为人家普通码农在工作时候需要整天研究算法,而是:

  1. 人家大公司不缺人应聘,当然选最好的。算法区分度高
  2. 算法好所带来的成果——解决问题能力强。

同样地,为什么学 Haskell ?工作上是用不到啊。但是学习使用 haskell 所带来的结果是什么?【抽象能力】。抽象能力的提高使得我写其他代码的能力显著提高,比如一些以前觉得很复杂的问题,通过Haskell的组合子逻辑,写成一串函数的组合,只需一行就能解决复杂的问题。我写py, js的时候就大量运用在Haskell里面学习到的知识。

所以你觉得,学 Haskell 到底用得到用不到?

30楼 · 回复
brambles 回复于 2016年01月18日

28楼 @vincentzhaorz

Java还要花一本书来讲在函数式语言中最多只会讲两页纸的东西,甚至很多地方会直接默认你已经 懂了。

31楼 · 回复
vincentzhaorz 回复于 2016年01月18日

30楼 @brambles

我并没有说Java比函数式语言好用,我想强调的只是“在一个日常工作的语言(Java)中应用函数式语言的思想”会更实用,尤其是对日常工作中主要处理业务逻辑的程序员来说。

而且我不知道你有没有读过那本书。Java里面目前有的函数式特性,确实只用两页纸就讲完了。但是函数式思想我觉得没有一本书能讲的这么压缩吧。

32楼 · 回复
尼克徐 回复于 2016年01月18日

29楼 @brambles

跑步这个比喻很贴切!

就好比说,练拳击的也要练跑步,练形意拳的需要练蹲马步和站桩一样。

这些“内功”,对练拳击形意拳等的“外功”起了很大的辅助作用。

33楼 · 回复
brambles 回复于 2016年01月18日

31楼 @vincentzhaorz 所以更要安利 Haskell 了。你试试 Haskell 就知道了,不用函数式的思想就连代码都写不出来。

34楼 · 回复
hrong 回复于 2016年01月18日

29楼 @brambles 你说得很有道理。我错了,对不起。 其实我就是吐槽一下自己的心情,完全不是针对楼主的。我也是个爱好学习的人,只是理想被现实磨得没有了棱角,上来吐槽,顺便mark一下以备下班回家后看帖。

35楼 · 回复
vincentzhaorz 回复于 2016年01月18日

33楼 @brambles

Haskell OCaml SML我都写过,每一种都写过或大或小的编译器或者算法,用Java写简单的函数式程序我也写过。

Haskell不用函数式当然也能写代码,甚至最简单粗暴的直接用do block + function as first-class citizen就行,只不过确实会麻烦很多。

我只是在强调用函数式思想的关键是解决现实中遇到的问题,既然Java在大型项目中用的这么广泛,并且这个语言中很多问题可以用函数式的思想来化解,那为何不先从Java入手来学习函数式编程?

简洁优雅的方案从来都是跟问题相关的,有些问题用Haskell来做就是简介优雅的,但有些问题确实用Haskell会难上很多倍:动态类型的脚本、基本的数据结构(栈和堆)、…… 您觉得实现一个栈用允许副作用的语言实现简洁优雅,还是用StateMonad来实现简洁优雅呢?

36楼 · 回复
newguy 回复于 2016年01月18日

35楼 @vincentzhaorz 做什么事情用什么工具,就像大家不会用java写网页和排版一样,因为有专门的CSS和javascript来处理这个事情。函数式语言并不能解决绝大多数项目中遇到的绝大部分问题,因此目前应用仍然很局限。如果一个程序员目标是去期货外汇市场写分析程序,那么就可能用得比较多,甚至可能天天用。对于大多数程序员来说,半年用不到一次,注定不会精通这门语言,就要考虑到投入的时间和回报的问题。不得不说这种语言还是很抽象的,即使理论学的好到真正用了也未必能很好很高效得解决问题,因为大多数学习者都缺乏实际经验的锻炼。如果做了几次效果都不好,肯定也会影响和打击继续学习的信心。

37楼 · 回复
vincentzhaorz 回复于 2016年01月18日

36楼 @newguy 我们说的是一个意思吧

38楼 · 回复
newguy 回复于 2016年01月18日

37楼 @vincentzhaorz 也许是吧。就是表达一下我的观点。

39楼 · 回复
duobei 回复于 2016年01月18日

加油 Haksell 还是不错的

本帖有39个回复,因为您没有注册或者登录本站,所以只能看到本帖的10条回复。如果想看到全部回复,请注册或者登录本站。
登录 或者 注册
[顶 楼]
|
|
[底 楼]
|
|
[首 页]