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

kos*_*tmo 4 haskell

我们被要求避免使用Haskell中比其他语言更加强调的部分功能.

这是因为部分函数在Haskell中比其他语言更常见(参见这个问题),还是在其他语言中避免使用它们是不切实际的?

jbe*_*man 8

这是因为部分函数在Haskell中比其他语言更常见(参见这个问题),还是在其他语言中避免使用它们是不切实际的?

当然是后者.最常用的语言都有一些null价值概念作为每种类型的居民,实际效果是每个值都类似于haskell Maybe a.

你可以说,在haskell中我们有同样的问题:底部可以隐藏在任何地方,例如

uhoh :: String
uhoh = error "oops"
Run Code Online (Sandbox Code Playgroud)

但实际情况并非如此.在haskell中,所有底部在道德上都是等价的,我们可以推断代码就好像它们不存在一样.如果我们可以在纯代码中捕获异常,那就不再是这种情况了.这是一个有趣的讨论.

而且只是一个主观的附录,我认为中间的haskell开发人员倾向于意识到某个功能是否是部分的,并且当他们惊讶地发现他们错了时会大声抱怨.同时,相当一部分Prelude包含部分功能,例如tail和,/并且尽管有很多关注和许多替代前奏,但这些功能并没有改变,我认为这证明了语言和标准库可能达到相当不错的平衡.

编辑我同意阿列克谢罗曼诺夫的答案也是图片的重要部分.

  • @kostmo大多数`-Wall`可以帮助您避免此类错误.使用ADT和模式匹配编译器可以告诉您是否涵盖了所有情况. (4认同)

Ale*_*nov 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版本中(并且正在进行改进的工作).