注意其他潜在的贡献者: 请不要犹豫使用抽象或数学符号来表达你的观点。如果我发现你的回答不清楚,我会要求澄清,但其他方面请随意表达自己在一个舒适的方式。
要明确: 我是 没有寻找一个“安全”的 head
,也没有选择的 head
特别是有意义的。这个问题的核心在 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
在某些语句的注释部分,我看到了一些关于这个 给你的讨论
我们有充分的理由不要让所有东西都“安全”,并在违反先决条件时抛出异常
我不一定要质疑这种说法,但我很好奇这些“好的理由”是什么。
另外,保罗 · 约翰逊说,
例如,你可以定义“ safeHead: : [ a ]-> Maybe a”,但是现在你不需要处理一个空列表或者证明它不可能发生,你必须处理“ Nothing”或者证明它不可能发生。'
The tone that I read from that comment suggests that this is a notable increase in difficulty/complexity/something, but I am not sure that I grasp what he's putting out there.
史蒂芬 · 普鲁齐纳说(2011年),
"There's a deeper reason why e.g 'head' can't be crash-proof. To be polymorphic yet handle an empty list, 'head' must always return a variable of the type which is absent from any particular empty list. It would be Delphic if Haskell could do that...".
允许空列表处理会丢失多态性吗?如果是这样,为什么会这样?有没有什么特别的例子可以说明这一点?任何进一步的想法,当然,感谢。
我会根据清晰度和建议的要求对本文进行编辑。您能提供的任何想法、论文等都将非常感谢。