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