我刚刚开始使用 Haskell,所以我正试图围绕“Haskell 的思维方式”展开思考。有没有理由使用模式匹配来解决问题1 here基本上是通过展开整个列表并递归调用函数,而不是像 myLast lst = lst 那样直接检索最后一个元素! ((长度 lst) - 1)
?这看起来几乎是蛮力的,但我认为这只是我对这里的不熟悉。
最佳答案
我能想到的几点:
(!!)
和length
最终是使用对列表结构的递归来实现的。既然如此,使用显式递归来实现这些基本功能可能是一个值得学习的练习。请记住,在后台,最后一个元素的检索不是直接的。由于我们正在处理链表,
length
必须遍历列表的所有元素,而(!!)
必须遍历所有元素直到所需的索引。既然如此,lst !! (length lst - 1)
遍历整个列表两次,而不是一次。 (根据经验,这就是为什么最好避免使用length
的原因之一,除非您实际上需要知道元素本身的数量,而不仅仅是作为其他东西的代理.)模式匹配是陈述数据类型结构事实的一种简洁方式。如果在递归地使用一个列表时,你匹配了一个
[x]
模式(或者,等效地,x : []
- 一个元素 consed 到空列表),你知道x
是最后一个元素。在某种程度上,匹配[x]
所涉及的间接级别比访问索引length lst - 1
处的列表元素少一级,因为它只处理列表的结构,而不需要将索引方案用 bolt 固定在其顶部。
话虽如此,您认为显式递归感觉“几乎是蛮力”的感觉从根本上是正确的。随着时间的推移,您会发现折叠、映射函数和其他捕获和抽象常见递归模式的方法,从而使以更流畅的方式编写成为可能。
关于Haskell 风格 : Pattern matching vs. 更直观的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52684964/