Что такое вложенный шаблон в Haskell? - PullRequest
5 голосов
/ 08 мая 2011

Что такое «вложенный» шаблон в Haskell.Я слышу термин везде, но не уверен, что он на самом деле означает.Как бы вы это определили?Есть примеры?

Заранее спасибо.

ИЗМЕНЕНО В ДОБАВИТЬ: (как указано в учебнике по запросу)

"Шаблоны могут содержать литералы и вложенные шаблоны, как в примерах:

addPair (0,y) = y

addPair (x,y) = x+y


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

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

Ответы [ 2 ]

6 голосов
/ 08 мая 2011

Это означает, что вы можете сопоставить шаблон, содержащий другой шаблон. В вашем примере шаблон (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 принимает Maybe, который содержит еще один Maybe (то есть Maybe (Maybe a)), и g' занимает Maybe (Maybe (Maybe a))

0 голосов
/ 08 мая 2011

Хотя я могу ошибаться, я могу только предположить из контекста, что «неопознанный» паттерн будет что-то вроде addPair x = x или addPair x y = x+y.Я считаю, что ваши аргументы - это образец.В большинстве языков программирования это будет просто x y.в то время как в этом случае ваш шаблон аргумента может быть более сложным, например, (x, y) или ((x, y), z).

Вложение, вероятно, означает «кортеж или список» или «неплоский кортеж или список».

...