以下是我和一个网友对haskell的讨论,记录在下面。以后有讨论时将在后面追加。
2011年9月24日:
Parker says: (下午10:52:06)
关于两个世界体系的对话:
函数编程语言与命令编程语言,这篇文章你看过没。Trustno1写的。
Parker says: (下午10:52:16)
真名不知到
gbx says: (下午10:52:33)
金尹, 好像
gbx says: (下午10:52:40)
翻译过programming erlang
Parker says: (下午10:53:08)
看来是挺牛的一个人,这篇文章很有深度
Parker says: (下午10:53:28)
xmonad的代码你看过没
gbx says: (下午10:53:49)
没有, 我学的很浅的, xmonad的code应该很深入的
gbx says: (下午10:55:31)
这人的数学看起来不错
Parker says: (下午10:57:06)
2300行左右的代码,挺精炼的
gbx says: (下午10:57:15)
你看过?
Parker says: (下午10:57:19)
这是大牛呀,在微软
Parker says: (下午10:57:23)
刚在看
Parker says: (下午10:57:42)
感觉代码写的很好
gbx says: (下午10:57:45)
haskell的杀手级应用还没有
gbx says: (下午10:57:59)
haskell的code不会写的很丑的
Parker says: (下午10:58:45)
你觉得f#如何
gbx says: (下午10:59:18)
f#当然不错, 可惜用的人也很少
gbx says: (下午10:59:33)
我以前看过f#的
Parker says: (下午11:00:03)
和haskell比谁的前景好呢
gbx says: (下午11:00:25)
不过它的优势在于跟.net platform无缝对接, 可以用来写library给其他语言, 比如c#, vb来用
gbx says: (下午11:00:38)
使用者肯定会比haskell多
gbx says: (下午11:01:14)
haskell的用户太小众, 而且都是业余用来写些小东西
gbx says: (下午11:01:33)
f#跟其他语言结合, 完全可以工业级应用
Parker says: (下午11:02:16)
觉得国外这些haskell的人都功底挺深厚的,很多基本原理的东西都先在haskell上有实现。
gbx says: (下午11:02:51)
f#的作者don syme也很爱haskell
Parker says: (下午11:03:33)
但f#只运行在微软的.net平台上,haskell结合llvm后也可以给其他语言写库的
gbx says: (下午11:03:59)
我曾经在maillist里看到过他的一封mail, 他本来是想基于haskell来实现f#, 可是无法无缝集成lazy跟.net, 最后用ocaml来做的
gbx says: (下午11:04:17)
最大的问题在于lazy
Parker says: (下午11:05:19)
看来要很好实现haskell的基本理念,如lazy和monad,需要在硬件上有变革才行
gbx says: (下午11:05:35)
这些跟硬件没关系吧?
gbx says: (下午11:06:10)
我觉得haskell最牛的设计有两个: type class和monad
gbx says: (下午11:06:22)
lazy看起来很美, 可是问题很多
Parker says: (下午11:06:46)
有关系的,你仔细看了那篇文章的话会有这个感觉的
Parker says: (下午11:07:08)
lazy不好做算法分析
gbx says: (下午11:07:55)
这样的code很牛:
in <- readFile "hello"
writeFile "world" in
gbx says: (下午11:08:32)
只有一句读, 一句写, 居然可以处理任意size的文件
gbx says: (下午11:08:53)
这是lazy很优雅的应用
gbx says: (下午11:09:45)
可是rwh上说的foldl很容易就stack overflow让人觉得又不爽. 高度不统一
gbx says: (下午11:09:52)
这就不优雅了
gbx says: (下午11:11:13)
用C语言写程序, 我就很痛恨:
while (! eof) {
char buf[4096] in;
}
gbx says: (下午11:12:05)
while (! eof ( f ) {
char buf[4096] in;
fread(f, buf, 4096);
fwrite(f, buf);
}
Parker says: (下午11:12:13)
这实际上就是硬件的问题,若这些变量不是存放在栈上,没有栈的函数就可以避免这个问题。基本上就和可用内存有关了。
gbx says: (下午11:13:02)
stack不overflow, 就会out of memory, 实际上都一样
gbx says: (下午11:13:31)
反正无法很优雅的处理这种情况
gbx says: (下午11:13:55)
还不如eager eval那样, 先算出表达式的值
Parker says: (下午11:13:56)
但一个进程的栈和可用内存相比是很小的。
gbx says: (下午11:14:29)
不能处理任何情况的code, 总让人不放心,
gbx says: (下午11:14:58)
那段处理文件读写的code就自动处理任意size的文件 多漂亮?
Parker says: (下午11:17:19)
真正的优化需要求助于现代的数学,如几何拓扑等。如果硬件设计改变了,可以根据函数的求值关系对中间计算结果的内存使用做优化。具体是数学家的事情了。
gbx says: (下午11:17:40)
所以我对lazy不满意
gbx says: (下午11:17:56)
不晓得作者们为什么这么执着
Parker says: (下午11:19:38)
lazy在解决有些问题时是非常有用的,这时可能用其他非lazy的方法很难找到解决方法。
gbx says: (下午11:20:04)
你是说处理无限的情况?
Parker says: (下午11:21:03)
haskell的社区非常好,如果apple,ibm等业界的公司有大力的支持,会超过f#
gbx says: (下午11:21:40)
问题在于haskell太难, 而且难以实用
Parker says: (下午11:22:10)
在有抽象代数类型的情况下,有递归定义的情况下
gbx says: (下午11:22:36)
比如一个公司在用c#开发程序, 一个小众开发者用f#做一个library, 那么很容易就可以集成到系统中
gbx says: (下午11:23:10)
可是如果用haskell的话, 那么就要全部code都要用haskell来写. 我想没几个老板敢这样决定的
gbx says: (下午11:23:38)
sml, ocaml之类都可以处理递归定义
Parker says: (下午11:23:41)
太难是暂时的,当函数式编程成为主流时,就不难了,那时的教育会跟上的。
gbx says: (下午11:23:59)
处理抽象代数类型我觉得haskell是跟ml学的
gbx says: (下午11:24:08)
二者简直一致的
gbx says: (下午11:24:36)
函数式编程很难成为主流, haskell更难成为主流
Parker says: (下午11:25:57)
haskell也可以作为独立的so库存在,由其他语言调用。
gbx says: (下午11:26:25)
:D很难集成吧.
gbx says: (下午11:26:37)
f#写的lib, 简直跟c#一样
gbx says: (下午11:26:47)
从c#去看的话, 没什么差别,
gbx says: (下午11:27:22)
调用者如果不在意的话, 根本不会想到是用f#写的
Parker says: (下午11:29:46)
那是因为有clr,这是ms搞的好东西。haskell的so库,别的语言也可以调用的,没有明显的不同。在mac os x上可以用object c调用haskell写的库。国外有公司在iphone上用haskell开发3D游戏应用卖钱。
gbx says: (下午11:31:14)
:)反正感觉F#更容易被开发者接受. 不过奇怪的是, f#好像也不景气
Parker says: (下午11:34:42)
软件要面对的需求在将来是会超出现在所能想到的复杂度的,当人工智能、需求变更频繁、并发越来越成为基础能力时,haskell这种函数式编程的计算模型会成为主流的。当然命令式编程也会作为主流存在。
gbx says: (下午11:35:31)
那是很远的未来了
gbx says: (下午11:35:48)
c语言到现在还这么坚挺,
Parker says: (下午11:35:51)
那是要用好f#需要越过haskell这道函数式编程基本概念的坎。
gbx says: (下午11:36:27)
haskell我觉得特别的就是: lazy, type class, monad
gbx says: (下午11:36:40)
其他的跟ML之类也没什么区别
Parker says: (下午11:36:41)
我觉得有生之年可以看到。软件技术的发展是很快的。
gbx says: (下午11:37:20)
现在很多嵌入式公司还在用C/c++
gbx says: (下午11:37:41)
网易的云风居然成了c语言的坚定支持者
Parker says: (下午11:38:46)
他和ml本就是一家的,只不过haskell是集众人之力,集百家之长,是最好的函数式编程语言而已。
Parker says: (下午11:43:07)
说实在的,我到现在也就是用c和汇编,汇编现在也很久没弄了。但c这适合在中低层领域,我一直都觉得c就是一种变形的高级汇编。c的存在将是较长久的,简单高效可控,谁不喜欢呀。你有兴趣可以看看python的c实现代码和object c在gcc中的c实现。
Parker says: (下午11:43:41)
在现有计算机体系架构下,c是一切的基础。
gbx says: (下午11:43:57)
用c来设计大系统当然可以, 可是太琐碎了
gbx says: (下午11:44:09)
生产力太低
Parker says: (下午11:48:15)
不会的,我之前用过gtk+,用这些东西写应用开发速度也不低,和c++比没有开发速度的劣势,而且少了很多编译器方面的干扰。我一个同事原来是用c++比较多的,后来也用c写应用了,觉得比c++好。当然,在不少时候c是不如其他高级语言好用。
gbx says: (下午11:49:10)
内存越界, 泄漏, 无效指针, 字符串处理...
gbx says: (下午11:49:33)
多少bug跟这些有关?
Parker says: (下午11:49:33)
把c用好,你需要了解其他语言的概念和实现。将这些语言的优势集成到c代码上。
gbx says: (下午11:49:56)
我C用得很好, 可是我还是觉得这是个bullshit语言
gbx says: (下午11:50:26)
c/c++, java都是bullshit
Parker says: (下午11:51:11)
那你喜欢哪些语言?
gbx says: (下午11:51:45)
python, ruby, erlang, f#, c#, haskell
gbx says: (下午11:52:00)
lua
gbx says: (下午11:52:16)
javascript
Parker says: (下午11:53:24)
javascript我也喜欢,c#从来没见过是啥样的,对其也没有兴趣。
gbx says: (下午11:53:45)
C#还不错的,
gbx says: (下午11:54:01)
不过常规的最喜欢ruby, 最爱的是haskell
Parker says: (下午11:55:37)
我觉得在c语言的上层有haskell和javascript就够了,然后用python写写脚本和简单的东西。基本上不再需要其他东西了。
gbx says: (下午11:55:55)
构造大系统是不够的
gbx says: (下午11:56:34)
twitter用ruby + scala
gbx says: (下午11:56:46)
ruby写WEB ui, scala处理后台数据
Parker says: (下午11:59:56)
那是因为人为的原因有些web框架,另外jvm是现在最主流的平台。haskell成熟后写大型系统完全没有问题,而且实现会更简单。觉得大型企业应用这块搞的太复杂了,没必要,感觉不只是技术问题,有商业和大公司政治的原因。
gbx says: (上午12:00:28)
你是老板, 你敢用haskell做大系统吗?
Parker says: (上午12:01:49)
现在国外有一些用haskell做的web框架,比ruby之类做的性能高很多。ruby是如何抢java的地盘的呢。
gbx says: (上午12:02:30)
ruby相对haskell简单太多了, 招聘很容易
gbx says: (上午12:02:45)
用haskell上哪儿招人去?
Parker says: (上午12:04:32)
简单是相对的,当整个教育都转过来了,haskell这些就不是很难的了。很多时候语言的难度都不是门槛,c++那么难还不是有那么多人用的不亦乐乎。
Parker says: (上午12:05:09)
真正难的是解决问题的方法和实现方法的难度,语言的难度是其次的。
gbx says: (上午12:05:29)
:Dc++虽然变态可是思想还是大家容易接受的, haskell的思想太难被命令式语言世界的人接受了
gbx says: (上午12:05:43)
改变大部分人太难了
Parker says: (上午12:05:54)
函数式编程的基本概念普及后就不难了。
gbx says: (上午12:06:19)
就像很多人觉得用QQ不好, 可是怎么也没办法让别人改用msn, gtalk...
gbx says: (上午12:06:47)
问题在于"函数式编程的基本概念普及"这件事情太难了
gbx says: (上午12:06:56)
你看你的同事有几个普及了?
Parker says: (上午12:07:01)
那是现在的现状,而且是国内的现状。人家国外在中学就教scheme,有这些概念。
gbx says: (上午12:07:31)
现在MIT那门课都用python代替了
Parker says: (上午12:07:35)
我正在向一个同事推广,这人有兴趣。
gbx says: (上午12:08:01)
我的同事几十个人没一个有兴趣
Parker says: (上午12:08:26)
我也是只有这一个。
gbx says: (上午12:08:44)
我喜欢FP只是觉得它漂亮, 能力实际上跟命令式语言差不多; 别人不这么看, 漂亮能当饭吃啊?
Parker says: (上午12:09:29)
sicp用python代替我也弄不明白,应该是其他原因。等书出了再看吧。
gbx says: (上午12:09:49)
python写程序多简单?
gbx says: (上午12:10:33)
scheme那么多括号, 看起来很丑陋. 很怪异
没有什么library, 不实用
gbx says: (上午12:11:02)
scheme又很深刻, 不适合入门
gbx says: (上午12:11:29)
对于新手来说, 用python入门多好
gbx says: (上午12:12:19)
haskell这样的东西只有我们这些geek才会喜欢
Parker says: (上午12:12:35)
不是漂亮的问题,是计算模型的选择,命令式语言有自己绕不过去的缺陷。我听说国外有的项目用其他语言都不成功,后来用lisp才成功。scheme是定位在教学上的,自然不实用。
Parker says: (上午12:13:51)
函数式编程将你解决问题的思维改变了,更符合人的思考习惯。
gbx says: (上午12:14:41)
:D我一直习惯用命令式语言写程序, 到现在还不习惯FP思维
gbx says: (上午12:14:53)
我学了这么久还不习惯, 更别说新手了
Parker says: (上午12:17:30)
实际上haskell这类函数式编程的概念并不难。我当年入门不是碰到haskell,是看了国外写的一个小短文《为什么函数式编程这么重要》,随后学了一点common lisp,然后就是sicp。最后想正式学一门函数式编程语言时从网上看了篇帖子选了haskell。
gbx says: (上午12:18:31)
真正写程序很别扭的
Parker says: (上午12:20:06)
我对这些概念接受还比较快,在实践上强迫丢掉之前的习惯。现在还算可以,不会觉得别扭。
gbx says: (上午12:20:26)
那恭喜你
Parker says: (上午12:23:24)
实际上我们是受命令式编程的影响太深了。当你理解了赋值语句是一个io操作时,就会看的更透了。如果是小孩子,没有接触任何编程的东西,一开始就学函数式编程,应该好很多。
gbx says: (上午12:24:32)
:DFP语言好像都不太实用
Parker says: (上午12:26:18)
那是用的不多,就像当年的smalltalk一样,现在不是被object c发扬光大了吗?另外听说最近流行的一个web框架也用smalltalk的一个方言实现的。