免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5475 | 回复: 7
打印 上一主题 下一主题

haskell学习的几点思考 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-22 01:45 |只看该作者 |倒序浏览
学习haskell一段时间了,这中间断断续续磕磕碰碰,到现在也还远没达到应用自如的程度。其实,Haskell并不是一门很难学的语言,至少其语法是很简洁统一的,之所以感觉上比较难入门,我想有一下几个方面:

1. 纯函数式范型。本质上与常见语言有所不同。

2. 中文资料稀少,而且翻来覆去就那么几篇数学游戏性质的介绍。英文的资料倒是不少,不过啃那些书真是太耗精力了。

3. 国内应用环境的稀少。缺少实际应用环境。大的项目直接用haskell不现实,辅助工具可以尝试,不过经常python就搞定了,更快更方便,主要是更熟悉啊。

4. 缺少引导,都是自己摸索,加之本人并没有几两理论基础,刚一接触haskell就见到一堆的lambda演算,beta替换,monad,范畴论之类的东西,很容易溺水身亡。说到这里,我觉得这一点,是我走弯路的根本原因:Haskell及其涉及的领域,社区,缺少一个由浅入深的层次,新人进入总会不知所措,不知深浅,信息超载。一个初学者要经过不断的碰壁挫折之后才能理出一个学习的路径来。而大多主流语言,因为前行者众多,已经给踏出了明晰的路径来,后来者循序渐进即可快速入门,不断提高。

在此根据我遇到的挫折与走过的弯路,跟想学习haskell的人提供几点基本建议,因为本人也属于刚刚入门阶段,所提建议仅供参考。

1. 树立信心: Haskell 绝对不是一门“怪异”的语言,当你熟悉了他之后就会觉得:程序就该是这个样子的!与C++比较起来,Haskell绝对要容易的多。
     以应用为目的的话,haskell是比较容易掌握和上手的,至少比C++容易。

2. 区别对待语言知识点,对于以应用为目的话,就不需要在开始纠缠于lambda演算,Monad定律,范畴论,Arrow什么的。我们用C++的话,写很久程序也不会天天纠缠于模板一类的东西。我们用命令式语言,也不一定要深晓图灵机的理论。

3. 选择一个好用的编辑器,如果之前就会用emacs的话,最好用emacs,因为emacs里haskell的自动函数名补全,缩进对齐等都很好用。

4. 类型是个好东西,因为有一样叫 Hoogle 的工具,用hoogle可以根据参数与返回值的类型,在不知道函数名的情况下快速搜索到想要的函数。

5. 熟悉下基本语法后,就要开始熟悉各种lib。 尤其是熟悉list 的处理,Data.List 模块中有大量的函数。Prelude 里的函数更是要很熟悉。有了大量的函数打底,就可以构建一个坚实的基础,遇到问题可以多种函数组合起来,不只提高效率,更重要的是构建一种FP解决问题的感觉。

6. Monad,初学者的拦路虎,我没啥好说的,如果像我一样笨的话就先绕过去吧。了解了 do <- 的基本用法后,应该就可以实际用了。并不是每个用 C++ STL的人都能说清楚模板的使用的。

7. 推荐下 Real world haskell 这本书。大部分Haskell的文档资料都太学术化,缺少与实际开发场景的联系, real world haskell算是目前最照顾程序员的了。

论坛徽章:
0
2 [报告]
发表于 2008-09-22 03:41 |只看该作者
我的感受是,不是在实际工作中需要而学习haskell多多少少有些自我感觉良好与好强,很难暂时去放弃某几个点,比如Monad,但是像Monad这东西初学者很难彻底理解。

我隔几个月想起来就看一眼haskell,大概一年前开始的,现在仍然只能勉强懂一点,基本是上面的原因。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2008-09-22 08:50 |只看该作者
我觉得把常见的 Haskell 运算符的优先级搞明白,
会给 Haskell 句子加括号,就算是已经入门了。

论坛徽章:
0
4 [报告]
发表于 2008-09-22 09:36 |只看该作者
我对C 的运算符优先级也没搞明白过,所以从来就是加括号。 haskell 里,我是编译过按照预想的输出执行结果就行,没刻意注意过优先级。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
5 [报告]
发表于 2008-09-22 09:53 |只看该作者
原帖由 flw 于 2008-9-22 08:50 发表
我觉得把常见的 Haskell 运算符的优先级搞明白,
会给 Haskell 句子加括号,就算是已经入门了。

这只能算是看见门了 离入门还有一段距离

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2008-09-22 10:04 |只看该作者
原帖由 albertlee 于 2008-9-22 01:45 发表
学习haskell一段时间了,这中间断断续续磕磕碰碰,到现在也还远没达到应用自如的程度。其实,Haskell并不是一门很难学的语言,至少其语法是很简洁统一的,之所以感觉上比较难入门,我想有一下几个方面:

1. 纯函数式范型。本质上与常见语言有所不同。

这是最关键的。往往许多人在学习 Haskell 之前就有了 imperative 语言的基础,也习惯了 imperative programming 的思考方式,突然换到 functional programming 后水土不服。只要思考方式能转过来,其他的就容易很多了。

2. 区别对待语言知识点,对于以应用为目的话,就不需要在开始纠缠于lambda演算,Monad定律,范畴论,Arrow什么的。我们用C++的话,写很久程序也不会天天纠缠于模板一类的东西。我们用命令式语言,也不一定要深晓图灵机的理论。

其他可以先放一下,但是 monad 最好能尽快掌握。因为恰当的使用 monad 可以使你的代码简单易懂易读许多。

4. 类型是个好东西,因为有一样叫 Hoogle 的工具,用hoogle可以根据参数与返回值的类型,在不知道函数名的情况下快速搜索到想要的函数。

类型系统绝对是 Haskell 的核心(之一)

5. 熟悉下基本语法后,就要开始熟悉各种lib。 尤其是熟悉list 的处理,Data.List 模块中有大量的函数。Prelude 里的函数更是要很熟悉。有了大量的函数打底,就可以构建一个坚实的基础,遇到问题可以多种函数组合起来,不只提高效率,更重要的是构建一种FP解决问题的感觉。

这个多用就好了。另外,学习 functional programming,光看书/资料是不够的,你还得亲自动手写代码解决问题才行。

6. Monad,初学者的拦路虎,我没啥好说的,如果像我一样笨的话就先绕过去吧。了解了 do <- 的基本用法后,应该就可以实际用了。并不是每个用 C++ STL的人都能说清楚模板的使用的。

在熟悉了 Haskell 基本语法后,monad 最好能尽快的啃下来,赶早不赶巧。

7. 推荐下 Real world haskell 这本书。大部分Haskell的文档资料都太学术化,缺少与实际开发场景的联系, real world haskell算是目前最照顾程序员的了。

Real World Haskell 中也有许多比较深入的内容,例如 monad transformer,当然对这些东西的介绍都是从实用的角度出发,而且这些东西在实际中也确实有用。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2008-09-22 10:07 |只看该作者
原帖由 albertlee 于 2008-9-22 09:36 发表
我对C 的运算符优先级也没搞明白过,所以从来就是加括号。  

这个在 Haskell 中也同样适用。而且由于 Haskell 是 static strong type system,许多不加括号导致的优先级错误直接就是编译时错误。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2008-09-22 10:09 |只看该作者
原帖由 mingyanguo 于 2008-9-22 03:41 发表
我的感受是,不是在实际工作中需要而学习haskell多多少少有些自我感觉良好与好强,很难暂时去放弃某几个点,比如Monad,但是像Monad这东西初学者很难彻底理解。

一般而言 FP,特殊而言 Haskell,光看(书/资料)是学不好的,你还要写(代码)。当然,看别人的代码也很有帮助。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP