Видя ваши правки, я думаю, что вы спрашиваете: Соответствие шаблону .
И чтобы ответить на ваш вопрос: Да, все, что вы можете построить, вы также можете «деконструировать», используя конструкторы. Например, вы, вероятно, знакомы с этой формой сопоставления с образцом:
head :: [a] -> a
head (x:xs) = x
head [] = error "Can't take head of empty list"
Однако, есть больше мест, где вы можете использовать сопоставление с образцом, другие допустимые обозначения:
head xs = case xs of
(y:ys) -> y
[] -> error "Can't take head of empty list"
head xs = let (y:ys) = xs
in y
head xs = y
where
(y:ys) = xs
Обратите внимание, что последние два примера немного отличаются от первого, поскольку они выдают разные сообщения об ошибках при вызове их с пустым списком.
Хотя эти примеры относятся только к спискам, вы можете сделать то же самое с другими типами данных, например так:
first :: (a, b) -> a
first tuple = x
where
(x, y) = tuple
second :: (a, b) -> b
second tuple = let (x, y) = tuple
in y
fromJust :: Maybe a -> a
fromJust ma = x
where
(Just x) = ma
Опять же, последняя функция также потерпит крах, если вы вызовете ее с помощью Nothing
.
Подвести итог; если вы можете создать что-то, используя конструкторы (например, (:)
и []
для списков, (,)
для кортежей или Nothing
и Just
для Maybe), вы можете использовать те же конструкторы для сопоставления с образцом Разнообразие способов.