繁体   English   中英

为什么'head'(来自prelude包)没有用Maybe的安全方式实现?

[英]Why 'head' (from the prelude package) has not been implemented the safe way with a Maybe?

在前奏中, head具有以下签名: head :: [a] -> a使得它在空列表中不安全,这是不好的!! head :: [a] -> Maybe a是一个好方法:-))

这适用于列表上的其他几个函数:last,tail,init minimum,maximum,cycle,last,init,foldl1,cycle ......实际上有很多这些errorEmptyList调用errorEmptyList

引用Stephen Diehl网站

“Safe提供了许多默认发布的各种部分功能(头部,尾部)的版本。将它包装在Maybe中被广泛认为是正确的方法,如果Haskell是今天设计的,它们就不会出现。”

我希望看到这些不安全的功能以某种方式用某种惯例标记,至少因为我不认为我们中的任何人喜欢在生产中出现异常时:-)

什么阻止社区在前奏中解决这些问题?

社区一直在Hackage上分发的自定义前奏中修复此问题。 但它不能解决前奏本身,而是由Haskell委员会负责。 对于向后兼容性问题,从未修复过。

(我个人更喜欢Relude的方法。这个前奏的head功能输入为NonEmpty a -> a 。)

真正的问题是,为什么有一个函数head 都没有 使用列表不需要这样做。 为了区分(x:_)[] ,作为“安全头”允许你,最好的选择是使用模式匹配,或合适的高阶函数/镜头操作符。

在实践中, head的唯一用途是当你处于某个大函数时,想要在某些列表xs (在许多其他参数中)的头部,你已经检查过它是非空的 ,例如因为其他一些条款已经涵盖了那。 在这种情况下,安全将是多余的。

可以说,这仍然是一个kludge,最好用模式匹配来表达。 但重点是,不安全的头部至少有一些丑陋但实用的用途,而安全的头部通常会增加额外的噪声,无论如何都需要进行模式匹配。

IMO, headtail!! 应该被弃用,而不是改变。 他们一直在哄骗来自Python等的初学者,认为他们需要这样的功能,但实际上这种风格本质上是针对Haskell的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM