Haskell有什么大惊小怪的?

我知道有几个程序员在他们之间一直在讨论Haskell,所以大家似乎都喜欢那种语言。 擅长Haskell似乎有点像天才程序员的标志。

有人可以给出几个Haskell例子,说明它为什么如此优雅/优越?


对我而言,以及我在认识Haskell一个月后认为是真实的事实是函数式编程以有趣的方式扭曲了你的大脑:它迫使你以不同的方式思考熟悉的问题:代替循环,考虑地图,折叠和过滤器等。一般来说,如果您对问题有不止一个视角,那么您可以更好地推理此问题,并根据需要切换视点。

另一个关于Haskell的非常整洁的事情是它的类型系统。 这是严格的类型,但类型推理引擎让它感觉像是一个Python程序,当你做出了一个愚蠢的类型相关的错误时,神奇地告诉你。 Haskell在这方面的错误信息有些欠缺,但随着您对自己的语言更熟悉,这就是打字应该是的!


这就是说服我学习Haskell的例子(我很高兴我做到了这一点)。

-- program to copy a file --
import System.Environment

main = do
         --read command-line arguments
         [file1, file2] <- getArgs

         --copy file contents
         str <- readFile file1
         writeFile file2 str

好的,这是一个简短易读的程序。 从这个意义上说,它比C程序更好。 但是,这与如何结构非常相似的Python程序有什么不同呢?

答案是懒惰评估。 在大多数语言(甚至是一些功能语言)中,像上面那样构造的程序会导致整个文件被加载到内存中,然后以新名称再次写出。

哈斯克尔是“懒惰的”。 它不计算东西,直到它需要为止,并且通过扩展不计算它永远不需要的东西。 例如,如果您要删除writeFile行,Haskell不会从第一个位置读取文件中的任何内容。

实际上,Haskell意识到writeFile依赖于readFile ,因此能够优化此数据路径。

虽然结果与编译器相关,但当运行上述程序时通常会发生的情况是:程序读取第一个文件的块(例如8KB),然后将其写入第二个文件,然后从第一个文件读取另一个块文件,并将其写入第二个文件,依此类推。 (尝试在它上面运行strace !)

...看起来很像文件副本的有效C实现。

所以,Haskell可以让你编写简洁易读的程序 - 通常不会牺牲很多性能。

我必须补充的另一件事是,Haskell只是很难写出错误的程序。 令人惊叹的类型系统,缺乏副作用,以及Haskell代码的紧凑性至少可以减少三个错误:

  • 更好的程序设计。 复杂性降低会导致更少的逻辑错误。

  • 紧凑的代码。 缺少存在错误的行。

  • 编译错误。 许多错误只是无效的Haskell。

  • Haskell不适合每个人。 但每个人都应该试试看。


    你有点问错了问题。

    Haskell不是一种语言,你可以看一些很酷的例子,然后去“啊哈,我现在看到了,这就是它的好处!”

    更像是,我们拥有所有这些其他编程语言,而且它们或多或少都是相似的,然后Haskell就完全不同了,而且一旦习惯了这种古怪的事情,这种方式完全可怕。 但问题是,适应这种古怪需要相当长的一段时间。 Haskell与几乎所有其他甚至半主流语言的区别在于:

  • 懒惰评估
  • 没有任何副作用(一切都是纯粹的,IO / etc通过monads发生)
  • 令人难以置信的表现力静态类型系统
  • 以及其他一些与许多主流语言不同的方面(但有一些共享):

  • 实用
  • 有意义的空白
  • 类型推断
  • 正如其他一些海报所回答的,所有这些功能的结合意味着您可以用完全不同的方式思考编程。 因此很难提出一个能够与Joe主流程序员充分沟通的例子(或一组例子)。 这是一个体验的事情。 (举个比喻,我可以给你看我1970年到中国旅行的照片,但在看完照片后,你仍然不知道在那段时间住在那里的感觉是什么样子。同样,我可以给你看一个Haskell '快速排序',但你仍然不知道成为一个哈斯克勒是什么意思。)

    链接地址: http://www.djcxy.com/p/42923.html

    上一篇: What's the fuss about Haskell?

    下一篇: Generating a unique value in Haskell do