Ответ 1
Представленные шаблоны имеют значительное совпадение с защитой шаблонов. Основное преимущество шаблонов представлений заключается в том, что они могут быть вложенными и избегать введения промежуточных переменных шаблона. Для глупых примеров:
endpoints (sort -> begin : (reverse -> end : _)) = Just (begin, end)
endpoints _ = Nothing
Эквивалент защиты шаблона требует, чтобы каждое новое представление связывало новую переменную шаблона, чередуя между оценкой выражений и шаблонами привязки.
endpoints xs
| begin : sorted <- sort xs
, end : _ <- reverse sorted
= Just (begin, end)
| otherwise = Nothing
В шаблонах просмотра также могут использоваться только те переменные, которые были связаны ранее в шаблоне, но он выглядит хорошо:
nonzero :: (a -> Int) -> a -> Maybe a
nonzero f (f -> 0) = Nothing
nonzero _ x = Just x
-- nonzero (fromEnum . not . null) "123" == Just "123"
-- "" == Nothing
Основное преимущество защиты шаблонов состоит в том, что они представляют собой простое обобщение охранников и могут включать обычные булевы выражения. Я обычно предпочитаю их по шаблонам просмотра, потому что я нахожу стиль case
и защищает менее повторяющийся, чем эквациональный стиль.