Haskell风格:模式匹配与更直观的解决方案

Jes*_*ess 3 haskell

我刚刚开始使用Haskell,所以我试图围绕"Haskell的思维方式".有没有理由使用模式匹配来解决问题1 这里基本上是通过展开整个列表并递归调用函数,而不是直接检索最后一个元素myLast lst = lst !! ((length lst) - 1)?它似乎几乎是暴力,但我认为这只是我对这里缺乏熟悉感.

dup*_*ode 9

我能想到的一些事情:

  • (!!)length最终使用列表结构的递归来实现.既然如此,使用显式递归来实现这些基本功能是一项值得学习的练习.

  • 请记住,在引擎盖下,最后一个元素的检索不是直接的.由于我们正在处理链表,length因此必须遍历列表的所有元素,并且(!!)必须遍历所有元素直到所需的索引.既然如此,lst !! (length lst - 1)两次完成整个列表,而不是一次.(这是为什么,length除非你实际上需要知道元素的数量本身,而不仅仅是作为其他东西的代理,否则更好地避免这一原因之一.)

  • 模式匹配是一种陈述数据类型结构事实的简洁方法.如果,在递归地使用列表时,您匹配[x]模式(或者,等效地,x : []- 与空列表相关的元素),您知道这x是最后一个元素.在某种程度上,匹配[x]涉及比在索引处访问列表元素更少的间接级别length lst - 1,因为它只处理列表的结构,而不需要将索引方案用螺栓固定在其顶部.

尽管如此,从根本上说你的感觉是明确的递归感觉"几乎是暴力".随着时间的推移,您将了解折叠,映射函数以及捕获和抽象常见递归模式的其他方法,从而可以更流畅地编写.

  • 请注意`(!!)`也是部分功能.避免`(!!)`通常是好的形式 - 所以你可以明确地处理相关的边缘情况. (2认同)