3

我正在关注一个教程。(真实世界的 Haskell)

我有一个关于空列表的头尾问题的初学者问题:在 GHCi 中,它返回异常。

直觉上我想我会说他们都应该返回一个空列表。你能纠正我吗?为什么不 ?(据我记得在 OzML 中,空列表的左侧或右侧返回 nil)

我肯定还没有在教程中讨论这个主题,但它不是错误的来源(如果不提供参数)?我的意思是,如果曾经向函数传递一个可能是可选的参数列表,那么用 head 读取它们可能会导致错误?

我只知道 GHCi 的行为,我不知道编译时会发生什么。

4

1 回答 1

13

直觉上我认为他们都应该返回一个空列表。你能纠正我吗?为什么不 ?

嗯-head[a] -> a。它返回单个的第一个元素;没有清单。

当空列表中没有第一个元素时?那么返回什么?您不能a从无到有创建类型的值,所以剩下的就是undefined- 一个错误。


tail?Tail 基本上是一个没有第一个元素的列表 - 即一个项目比原始项目短。如果没有第一要素,您就无法维护这些法律。

当你从盒子里拿出一个苹果时,你不可能有同一个盒子(当 时发生了什么tail [] == [])。行为也必须undefined如此。


这导致以下结论:

我肯定还没有在教程中讨论这个主题,但这不是错误的来源吗?我的意思是,如果曾经向函数传递一个可能是可选的参数列表,那么用 head 读取它们可能会导致错误?

是的,它是错误的来源,但因为它允许编写有缺陷的代码。基本上是试图读取一个不存在的值的代码。所以:*永远不要使用头/尾** - 使用模式匹配。

sum     [] = 0
sum (x:xs) = x + sum xs

编译器可以保证涵盖所有可能的情况,始终定义值并且阅读起来更加清晰。

于 2010-08-22T19:35:01.813 回答