我正在关注一个教程。(真实世界的 Haskell)
我有一个关于空列表的头尾问题的初学者问题:在 GHCi 中,它返回异常。
直觉上我想我会说他们都应该返回一个空列表。你能纠正我吗?为什么不 ?(据我记得在 OzML 中,空列表的左侧或右侧返回 nil)
我肯定还没有在教程中讨论这个主题,但它不是错误的来源(如果不提供参数)?我的意思是,如果曾经向函数传递一个可能是可选的参数列表,那么用 head 读取它们可能会导致错误?
我只知道 GHCi 的行为,我不知道编译时会发生什么。
我正在关注一个教程。(真实世界的 Haskell)
我有一个关于空列表的头尾问题的初学者问题:在 GHCi 中,它返回异常。
直觉上我想我会说他们都应该返回一个空列表。你能纠正我吗?为什么不 ?(据我记得在 OzML 中,空列表的左侧或右侧返回 nil)
我肯定还没有在教程中讨论这个主题,但它不是错误的来源(如果不提供参数)?我的意思是,如果曾经向函数传递一个可能是可选的参数列表,那么用 head 读取它们可能会导致错误?
我只知道 GHCi 的行为,我不知道编译时会发生什么。
直觉上我认为他们都应该返回一个空列表。你能纠正我吗?为什么不 ?
嗯-head
是[a] -> a
。它返回单个的第一个元素;没有清单。
当空列表中没有第一个元素时?那么返回什么?您不能a
从无到有创建类型的值,所以剩下的就是undefined
- 一个错误。
和tail
?Tail 基本上是一个没有第一个元素的列表 - 即一个项目比原始项目短。如果没有第一要素,您就无法维护这些法律。
当你从盒子里拿出一个苹果时,你不可能有同一个盒子(当 时发生了什么tail [] == []
)。行为也必须undefined
如此。
这导致以下结论:
我肯定还没有在教程中讨论这个主题,但这不是错误的来源吗?我的意思是,如果曾经向函数传递一个可能是可选的参数列表,那么用 head 读取它们可能会导致错误?
是的,它是错误的来源,但因为它允许编写有缺陷的代码。基本上是试图读取一个不存在的值的代码。所以:*永远不要使用头/尾** - 使用模式匹配。
sum [] = 0
sum (x:xs) = x + sum xs
编译器可以保证涵盖所有可能的情况,始终定义值并且阅读起来更加清晰。