[英]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, head
, tail
和!!
应该被弃用,而不是改变。 他们一直在哄骗来自Python等的初学者,认为他们需要这样的功能,但实际上这种风格本质上是针对Haskell的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.