相关疑难解决方法(0)

为什么Haskell的`head`在空列表中崩溃(或者为什么*不返回空列表)?(语言哲学)

其他潜在贡献者请注意:请不要犹豫,使用抽象或数学符号来表达您的观点.如果我发现你的答案不清楚,我会要求澄清,但你可以随意以舒适的方式表达自己.

要明确:我不是在寻找"安全" head,也不是head特别有意义的选择.问题的关键在于讨论head和讨论,并head'提供了背景.

我几个月来一直在用Haskell进行攻击(直到它已经成为我的主要语言),但我对一些更先进的概念以及语言哲学的细节都不了解(尽管我非常愿意学习).那么我的问题不是技术问题(除非它是,我只是没有意识到),因为它是一种哲学.

对于这个例子,我说的是head.

我想你会知道,

Prelude> head []    
*** Exception: Prelude.head: empty list
Run Code Online (Sandbox Code Playgroud)

这是从head :: [a] -> a.很公平.显然,一个人不能返回(挥手)没有类型的元素.但与此同时,定义它很简单(如果不是微不足道的话)

head' :: [a] -> Maybe a
head' []     = Nothing
head' (x:xs) = Just x
Run Code Online (Sandbox Code Playgroud)

我见过一些这方面的讨论很少在这里的某些语句的注释部分.值得注意的是,一位Alex Stangl说

"有充分的理由不让一切都"安全",并在违反前提条件时抛出异常.

我不一定质疑这个断言,但我很好奇这些"好理由"是什么.

此外,保罗约翰逊说,

'例如你可以定义"safeHead :: [a] - >也许是",但现在不是处理空列表或证明它不会发生,你必须处理"没什么"或证明它不会发生".

我从该评论中读到的语气表明,这是难度/复杂度/事物的显着增加,但我不确定我是否掌握了他在那里推出的内容.

一位Steven Pruzina说(2011年,不低于),

"有一个更深层次的原因,例如'head'不能防止崩溃.要进行多态而处理空列表,'head'必须始终返回任何特定空列表中不存在的类型变量.它将是Delphic如果Haskell能做到这一点......".

允许空列表处理会导致多态性丢失吗?如果是这样,怎么样,为什么?是否有特殊情况会使这一点变得明显?本节由@Russell O'Connor充分回答.当然,任何进一步的想法都会受到赞赏.

我会根据清晰度和建议来编辑这个.您可以提供的任何想法,论文等都将非常感激.

polymorphism haskell parametric-polymorphism

72
推荐指数
3
解决办法
2万
查看次数