我刚刚开始使用Haskell,所以我试图围绕"Haskell的思维方式".有没有理由使用模式匹配来解决问题1 这里基本上是通过展开整个列表并递归调用函数,而不是直接检索最后一个元素myLast lst = lst !! ((length lst) - 1)
?它似乎几乎是暴力,但我认为这只是我对这里缺乏熟悉感.
我能想到的一些事情:
(!!)
并length
最终使用列表结构的递归来实现.既然如此,使用显式递归来实现这些基本功能是一项值得学习的练习.
请记住,在引擎盖下,最后一个元素的检索不是直接的.由于我们正在处理链表,length
因此必须遍历列表的所有元素,并且(!!)
必须遍历所有元素直到所需的索引.既然如此,lst !! (length lst - 1)
两次完成整个列表,而不是一次.(这是为什么,length
除非你实际上需要知道元素的数量本身,而不仅仅是作为其他东西的代理,否则更好地避免这一原因之一.)
模式匹配是一种陈述数据类型结构事实的简洁方法.如果,在递归地使用列表时,您匹配[x]
模式(或者,等效地,x : []
- 与空列表相关的元素),您知道这x
是最后一个元素.在某种程度上,匹配[x]
涉及比在索引处访问列表元素更少的间接级别length lst - 1
,因为它只处理列表的结构,而不需要将索引方案用螺栓固定在其顶部.
尽管如此,从根本上说你的感觉是明确的递归感觉"几乎是暴力".随着时间的推移,您将了解折叠,映射函数以及捕获和抽象常见递归模式的其他方法,从而可以更流畅地编写.
归档时间: |
|
查看次数: |
108 次 |
最近记录: |