Haskell 风格 : Pattern matching vs. 更直观的解决方案

标签 haskell

我刚刚开始使用 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/

相关文章:

haskell - 神秘的串行端口行为

haskell - 从 Prolog 到 Haskell 的思考——生成真值组合列表

haskell - 连接自定义向量

regex - 使用Haskell Parsec一次解析正则表达式

haskell - 在 Haskell 中使用填充进行压缩

haskell - 如何在haskell中替换表达式中的变量?

haskell - 类型良好的函数的 eta 减少如何导致类型错误?

haskell - Haskell 函数中的模式匹配

haskell - 自动派生 GADT 的展示实例

haskell - 我可以制作一个消耗所有生产者输出并将其作为列表传递的管道吗?