Haskell开发人员常见的编程错误要避免吗?

时间:2009-08-01 17:53:36

标签: haskell

本着问题中其他常见错误的精神,Haskell程序员最常犯的错误是什么?我一直在教自己Haskell一段时间,我开始对语言感到很自在,开始在现实世界中应用它。

5 个答案:

答案 0 :(得分:15)

我所知道的最常见的错误是通过延迟评估引入空间泄漏。有很多方法可以实现这个错误,但是特别指出程序员具有其他功能编程经验的方法是将结果放在累积参数中,认为累积参数将占用恒定的空间。在许多情况下,累积参数需要线性空间,因为不评估参数。

另一个常见错误是忘记let总是递归。无意的

let x = ... x ...

会导致莫名其妙的结果。

大多数其他常见的错误体验不是表现为错误,而是表示程序通过类型检查程序,或者难以理解monadic I / O模型。列表推导和do符号的困难偶尔会出现。

一般来说,开始使用Haskell程序员所面临的困难包括

  • 具有许多黑暗角落的大型语言,尤其是在类型系统中
  • 无法编译程序,特别是当他们执行I / O时
  • IO monad
  • 中执行所有操作
  • 很难预测懒惰功能程序的时间和空间行为

答案 1 :(得分:8)

开始 Haskell程序员的常见错误是forget the difference between constructor and type namespaces。这是一个初学者的错误,我很尴尬地把我的名字附加到它上面,但我很有信心,当他们遇到类似的问题时,其他人会偶然发现这个答案,所以不妨把它放在那里。 / p>

答案 2 :(得分:4)

[][[]]之间的区别:空列表和包含1个元素的列表,即空列表。这个特别是在递归函数的基本情况下弹出。

答案 3 :(得分:-1)

使用非尾递归函数或不发生堆栈溢出的严格折叠。

答案 4 :(得分:-1)

表达的概念对于初学者来说是相当混乱的。采用命令式编程语言中的条件结构。它只是一个构造,但在Haskell中它是一个表达式。因此if条件必须具有匹配的else,并且两者都必须产生相同类型的评估的值。

wrongFunc n = if n > 18
              then 1
              else False

if块计算整数,其中else返回bool。这是一个常见错误,因为在Haskell中它们不仅仅是语句块而是表达式。