我们强烈要求avoid partial functions在Haskell中比其他语言更加重视。
这是因为部分函数在Haskell中比其他语言更常见(c.f。this question),还是在其他语言中避免使用它们是不切实际的呢?
答案 0 :(得分:8)
这是因为部分函数在Haskell中比其他语言更常见(c.f。这个问题),还是在其他语言中避免使用它们是不切实际的?
当然是后者。最常用的语言都有null
值的概念作为每种类型的居民,实际效果是每个值都类似于haskell的Maybe a
。
你可以说,在haskell中我们有同样的问题:底部可以隐藏在任何地方,例如。
uhoh :: String
uhoh = error "oops"
但事实并非如此。在haskell中,所有底部在道德上都是等价的we can reason about code as if they didn't exist。如果我们可以在纯代码中捕获异常,那就不再是这种情况了。这是一个interesting discussion。
只是一个主观的附录,我认为中级的开发人员倾向于意识到一个功能是否是偏袒的,并且当他们惊讶地发现他们错了时会大声抱怨。与此同时,Prelude
的相当一部分包含部分功能,例如tail
和/
,尽管有很多关注和许多替代前奏,但这些功能并没有改变,我认为证据表明语言和标准习惯可能达到相当不错的平衡。
编辑我同意Alexey Romanov的答案也是图片的重要部分。
答案 1 :(得分:8)
与其他语言相比,Haskell中部分函数明显更差的一个原因是缺省情况下缺少堆栈跟踪。当你打电话时head
在空列表中,您只能获得Prelude.head: empty list
。祝你好运找出head
的问题或者空名单的来源!当然,它甚至可能不在您的代码中,而是在您使用的某些库中。
要获得堆栈跟踪,您需要使用启用的性能分析进行编译或使其明确可用:请参阅https://hackage.haskell.org/package/base-4.9.1.0/docs/GHC-Stack.html和https://wiki.haskell.org/Debugging。这两个选项都出现在相对较新的GHC版本中(目前正在进行改进)。