Haskell中的嵌套模式是什么?

5

什么是Haskell中的“嵌套”模式?我到处都听到这个术语,但不确定它实际上是什么意思。你如何定义它?有任何示例吗?

谢谢提前。

编辑后添加:(按照要求在教科书中引用)

“模式可以包含文字和嵌套模式,例如:

addPair (0,y) = y

addPair (x,y) = x+y


shift :: ((Int,Int),Int) -> (Int,(Int,Int))

shift ((x,y),z) = (x,(y,z))

我猜这可能与在Haskell中广泛使用的递归逻辑有关。 - Pieter
@Pieter应该比那更简单。 - maclunian
2
能否举个你听到的例子?据我所知,这个术语没有固定的含义。 - Ingo
好的@Ingo和@Pieter,请阅读上面的内容。 - maclunian
2个回答

6

这意味着您可以匹配包含其他模式的模式。在您的示例中,(x, y) 模式包含在较大的 ((x, y), z) 模式中。嵌套可以任意深入,例如以下所有内容都是合法的:

f    ((x2,x0),x1)                 = ()
f'   (((x3, x2),x0),x1)           = ()
f''  ((((x4,x3), x2),x0),x1)      = ()
f''' (((((x5,x4),x3), x2),x0),x1) = ()

等等。这也适用于列表和代数数据类型:

f  [[x]]   = ()
f' [[[x]]] = ()

g  (Just (Just x))        = ()
g' (Just (Just (Just x))) = ()

这里,f 接受一个列表的列表,f' 接受一个列表的列表的列表,g 接受一个包含另一个 MaybeMaybe(即 Maybe (Maybe a)),而 g' 接受一个 Maybe (Maybe (Maybe a))


啊,我现在开始明白了 ;) - maclunian
请注意,我认为这种措辞不够恰当 - 因为嵌套通常与词法作用域相关,但是无论模式嵌套多深,模式中的变量都必须是线性的。因此,“子模式”可能更好(类比于“子表达式”)。 - Ingo
这些确实是嵌套而不是“子模式”。也就是说,模式匹配实际上是通过匹配嵌套的数据值进行的。正则表达式中的“子模式”仍然匹配线性字符序列。在这里,嵌套模式必须实际匹配嵌套的数据结构,而不是线性结构。 - MtnViewMark

0

虽然我可能错了,但我只能从上下文中推断出“未嵌套”模式可能是像addPair x = xaddPair x y = x+y这样的东西。我相信你的参数是一个模式。在大多数编程语言中,这将是一个简单的x y。而在这种情况下,你的参数模式可能会更加复杂,例如(x, y)((x, y), z)

嵌套可能意味着“元组或列表”或“非平面元组或列表”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接