当前位置:  开发笔记 > 人工智能 > 正文

你对Haskell感到满意需要多长时间?

如何解决《你对Haskell感到满意需要多长时间?》经验,为你挑选了4个好方法。

我是一个好的C/C++程序员.我发现Haskell非常有趣.但在我看来,虽然编写干净的Haskell代码相对容易,因为它模仿数学(我很熟悉)很好,但在Haskell中运行快速编写干净代码非常困难.

快速版本的Haskell快速版本非常长而且可怕,与天真但短暂(两行),干净和直观的实现没有相似之处.Haskell的长而可怕的版本实际上仍然比更短更简单的C计数器部分慢得多.

是因为当前的Haskell编译器太笨了还是凡人(当然不是SJP)编写快速的Haskell代码是不可能的?



1> Norman Ramse..:

你问两个不同的问题:学习和表现.

我花了大约一个月的时间成为舒适与使用递归函数式编程,模式匹配,map,filter,和fold.我用ML做了所有这些,但它很容易翻译成Haskell.

我花了两三年时间把头包裹在monads周围,但那是因为我读错了东西.我认为现在有更好的教程.但如果你刚开始,请避开monads一段时间.

我花了好几个月才擅长创建新类型,但使用现有类很容易.

我仍然不确定我是否有懒惰的评价.但是我喜欢Haskell的纯洁,倾向于将懒惰的评价视为一个不幸的事故,只有少数人(如John Hughes)知道如何利用.

你观察到一个性能问题只是因为你已经改编了一个载有突变的算法,Tony Hoare为命令式语言设计了这个算法,并试图转化为Haskell.在Haskell中,与任何其他功能语言一样,昂贵的操作是分配.尝试编写合并排序,你会发现它很简单并且表现非常好.

你如何避免将来犯同样的错误?看看Chris Okasaki的书Purely Functional Data Structures.好书,它将帮助您学习"功能性的做事方式",而不会放弃表现.



2> Daniel Earwi..:

有一个非常具体的原因,为什么快速排序在Haskell中不那么快.这是一个像神一样的算法的例子,其中有很好的hackery编织成它的工作原理 - 在这种情况下我的意思是hackery是一种真正的Haskell奉献者会认为是不必要的危险和非数学的技术.最初的实现尽一切努力打破Haskell对自身施加的规则:真正的快速排序通过用新信息覆盖存储槽来实现.这在Haskell中非常痛苦,它发现更容易制作现有信息的全新副本.

因此,虽然那个天真的两行Haskell版本捕获了快速排序的本质(它进行了相同数量的关键比较),但它并不是真正的快速排序.它缺少了进入它的大部分天才,它充分利用了调整现有值状态的能力.因此,它会生成大量的列表中间副本.

猜测:Haskell编译器是否可以分析您的代码,应用与Hoare(quicksort的发明者)相同的推理并找出它可以通过完全重新实现它来以状态方式优化它?有可能.



3> TheMarko..:

关键不是编写快速的Haskell代码,而是快速编写Haskell代码.当你到达那里并且需要快速编写代码(呃)时,开始优化(或使用FFI,你不必忘记你的C++技能).在Haskell中,您首先要寻求优雅,可靠和可维护性.我会为我的Haskell-fu添加分析,因此您不要浪费时间来优化未使用的分析.并且切记不要过早优化.



4> Magnus..:

因此,为了回答标题中的问题,您可能会在短时间内感受到Haskell的基础知识.特别是如果您已经熟悉函数式编程.真正让Haskell脱颖而出的东西,比如懒惰,类型类,类型族,当然还有可怕的monad(和箭头)可能需要更多时间来理解和习惯.学习语言有很好的资源,许多是免费提供的,还有一个乐于助人的社区,所以我说你可能会在一两个半严肃的学习中感觉舒服;-)

我认为这是值得的,就像有些人认为,即使你从来没有真正使用它,也值得学习Lisp.这是值得的,因为它让你成为一个更好的程序员 - 它会让你有不同的想法.我认为Haskell有类似的效果.

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有