提醒其他潜在贡献者:请毫不犹豫地使用抽象或数学符号来表达您的观点。如果我发现您的回答不清楚,我会要求您解释,但否则请随意以舒适的方式表达自己。
明确一下:我不寻找一个“安全”的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说:
'在违反前提条件时抛出异常并不是所有情况都安全的,有很多好理由不这样做。'
我不一定质疑这种说法,但我很好奇这些“好理由”是什么。
此外,Paul Johnson说:
“例如,您可以定义'safeHead :: [a] -> Maybe a',但现在,您必须处理'Nothing'或证明它不可能发生,而不是处理一个空的列表或证明它不可能发生。”
我从评论中读到的语气表明这会增加困难/复杂性/某些东西,但我不确定他想表达什么。
Steven Pruzina(在2011年)说:
"这里有一个更深层次的原因,即例如 'head' 无法保证不崩溃。为了实现多态且处理空列表,'head' 必须始终返回一个类型变量,该变量不存在于任何特定的空列表中。如果Haskell可以实现这一点,那就是神谕...".
如果允许处理空列表,是否会丢失多态性?如果是这样,为什么?有哪些特定情况会使这一点显而易见?@Russell O'Connor已经充分回答了这个问题。当然,欢迎提出任何进一步的想法、论文等。
根据需要,我将对此进行编辑。非常感谢您提供的任何思路、论文等。