其他潜在贡献者请注意:请不要犹豫,使用抽象或数学符号来表达您的观点。如果我发现您的答案不清楚,我会要求说明,但请随意以舒适的方式表达自己。
需要明确的是:我不是在寻找“安全” head
,也不是head
特别有意义的选择。head
问题的核心是和的讨论head'
,它们提供了上下文。
我已经用 Haskell 破解了几个月了(以至于它已经成为我的主要语言),但我承认我对一些更高级的概念和语言哲学的细节并不了解(尽管我非常愿意学习)。那么我的问题与其说是技术问题(除非它是,我只是没有意识到),不如说它是哲学问题之一。
对于这个例子,我说的是head
.
我想你会知道的,
Prelude> head []
*** Exception: Prelude.head: empty list
这从head :: [a] -> a
. 很公平。显然,不能返回(挥手)无类型的元素。但同时,定义很简单(如果不是微不足道的)
head' :: [a] -> Maybe a
head' [] = Nothing
head' (x:xs) = Just x
我在某些陈述的评论部分看到了一些关于这个的小讨论。值得注意的是,一位 Alex Stangl 说
“有充分的理由不让一切都“安全”,并在违反先决条件时抛出异常。
我不一定质疑这个断言,但我很好奇这些“好理由”是什么。
此外,保罗约翰逊说,
'例如,您可以定义“safeHead :: [a] -> Maybe a”,但现在不是处理空列表或证明它不会发生,您必须处理“Nothing”或证明它不会发生。
我从那条评论中读到的语气表明,这是难度/复杂性/某事的显着增加,但我不确定我是否理解他在那里提出的内容。
一位 Steven Pruzina 说(在 2011 年,不少于),
“有一个更深层次的原因,例如‘head’不能防崩溃。要多态但处理空列表,‘head’必须始终返回任何特定空列表中不存在的类型的变量。它会是Delphic 如果 Haskell 能做到这一点……”。
允许空列表处理是否会丢失多态性?如果是这样,怎么会,为什么?是否有特殊情况可以使这一点显而易见?这部分由@Russell O'Connor 充分回答。当然,任何进一步的想法都会受到赞赏。
我将根据清晰度和建议的要求对其进行编辑。您可以提供的任何想法、论文等将不胜感激。