在Haskell中避免使用部分函数比其他语言更容易吗?

时间:2017-07-14 01:20:43

标签: haskell

我们强烈要求avoid partial functions在Haskell中比其他语言更加重视。

这是因为部分函数在Haskell中比其他语言更常见(c.f。this question),还是在其他语言中避免使用它们是不切实际的呢?

2 个答案:

答案 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.htmlhttps://wiki.haskell.org/Debugging。这两个选项都出现在相对较新的GHC版本中(目前正在进行改进)。