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

时间:2018-10-07 02:24:33

标签: haskell

我只是从Haskell入手,所以我想将自己的想法围绕“ Haskell的思维方式”。是否有理由使用模式匹配来解决问题1 here,基本上是通过展开整个列表并递归调用函数,而不是像myLast lst = lst !! ((length lst) - 1)那样直接检索最后一个元素来解决问题1?似乎几乎是蛮力的,但我认为这只是我在这里不熟悉。

1 个答案:

答案 0 :(得分:9)

我能想到的几件事:

  • (!!)最终是通过对列表结构进行递归来实现的。这样,使用显式递归实现那些基本功能可能是一个值得学习的练习。

  • 请记住,在幕后,最后一个元素的检索不是直接的。由于我们正在处理链接列表,因此length必须遍历列表的所有元素,而length必须遍历所有元素直至所需的索引。这样,(!!)在整个列表中运行两次,而不是一次。 (这是为什么最好避免使用lst !! (length lst - 1)的原因之一,除非您实际上需要知道元素本身的数量,而不仅仅是了解其他元素。)< / p>

  • 模式匹配是陈述有关数据类型结构事实的一种巧妙方法。如果在递归使用列表的同时匹配length模式(或等效地,[x]-被限制为空列表的元素),则您知道x : []是最后一个元素。在某种程度上,匹配x所涉及的间接级别比访问索引[x]处的列表元素少,因为它只处理列表的结构,而无需在索引上附加索引方案。

说了这么多,从根本上来说,您的感觉是明确的递归感到“几乎是蛮力”。随着时间的推移,您会发​​现有关折叠,映射功能以及其他捕获和抽象通用递归模式的方法,从而可以更流畅地进行书写。