【问题标题】:Functionality of as-pattern, non overlapping pattern through 'as pattern'as-pattern 的功能,通过“as pattern”不重叠的模式
【发布时间】:2015-08-03 19:17:33
【问题描述】:

我是函数式编程的新手,尤其是 haskell,并且有两个问题比比皆是,因为模式和通过使用它来减少重叠。 给出以下代码示例:

last1 :: [a]          ->  a
last1    [x]          =   x
last1    (x:xs)       =   last xs

last2 :: [a]          ->  a
last2    [y]          =   y
last2    (y:ys@(_:_)) =   last ys

last1last2 相比不应重叠。 让我们看一下具体的字符串f:[]。它将匹配last1 中的[x](x:xs)

last2中,它将匹配[y]。但不适用于(y:ys@(_:_)),因为ys 必须匹配(_:_) 并且只满足[] 的第一个any 模式。

我的假设正确吗?

现在看看具体的字符串f:o:o:[]。现在模式 (y:ys@(_:_)) 匹配。在这种情况下,我很好奇绑定是如何工作的。第一次通话后ys 是什么?我假设它是o:o:[]

【问题讨论】:

  • 为什么不x1:x2:_?我看不出有什么理由在这里使用“as”模式。
  • 这是我教授的一个示例,用于描述模式和绑定。但这与其说是解释,不如说是提及。
  • @dredozubov:你怎么知道在你的例子中递归什么?
  • @Guvante 我的意思是:没有必要给子表达式起别名
  • @dredozubov:您的示例删除了列表的其余部分,因此无法工作。 x1:x2:xs 可以工作,但 x1:x2:_ 不能在列表的其余部分上递归,因此无法获得最后一项。

标签: haskell design-patterns overlapping-matches as-pattern


【解决方案1】:

在这两种情况下,您的递归都将转到last,而不是last1/last2

last1last2 相比不应重叠。 让我们看一下具体的字符串f:[]。它将匹配last1 中的[x](x:xs)

它可以匹配(x:xs),但它不会匹配,因为模式匹配只会匹配第一个成功。在这方面重叠并没有歧义(总是采用第一个定义)。

last2中,它将匹配[y]。但不适用于(y:ys@(_:_)),因为ys 必须匹配(_:_),并且只需满足[] 的第一个any 模式。

您的措辞有点奇怪,但您是正确的,f:[] 无法匹配 (y:ys@(_:_)),因为后者基本上匹配 _:_:_,这不是匹配项。

现在看看具体的字符串f:o:o:[]。现在模式 (y:ys@(_:_)) 匹配。在这种情况下,我很好奇绑定是如何工作的。第一次通话后ys 是什么?我假设它是o:o:[]

ys 等于 o:o:[](或 "oo"[o,o])。

【讨论】:

    【解决方案2】:

    这两个函数在 Haskell 中是相同的,因为使用了第一个匹配方程。你的第二个函数更明确一点,但第一个更惯用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 2012-06-02
      • 2013-02-03
      • 2012-06-25
      相关资源
      最近更新 更多