2013-12-24 2 views
12

Я пытаюсь понять взаимосвязь между шаблонами взглядов и стражками шаблонов в GHC. Шаблоны охранников кажутся довольно интуитивными, в то время как шаблоны представления кажутся немного запутанными. Это похоже на то, что шаблоны просмотра лучше справляются с вещами глубоко в шаблоне, в то время как шаблоны могут повторно использовать представление более интуитивно, но я не совсем понимаю его.Просмотр шаблонов против стражей шаблонов

ответ

11

Просмотреть рисунки имеют значительное перекрытие с защитными элементами. Основное преимущество шаблонов представлений заключается в том, что они могут быть вложенными и избегать введения промежуточных переменных шаблона. Для глупого примера:

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 и защищает менее повторяющийся, чем эквациональный стиль.

6

Просмотреть шаблоны, чтобы вы проецировали значение перед сопоставлением с шаблоном. Это почти можно рассматривать как короткий путь для

foo x = case f x of 
    ... 

Там немного сахара на вершине для работы с более сложными видами, но в основном это все. С другой стороны, модели охранники строго более общим,

  1. Они могут включать в себя произвольные логические условия для согласования
  2. Они могут совпадать с использованием более чем одной из переменных

Я предпочитаю вид модели, когда Я делаю что-то «линзоподобное». У меня есть большой объем данных, и меня интересует один конкретный взгляд на него. Например, с объективом

foo (view someLens -> Bar baz quux) = ... 

Устройства защиты от травм, как правило, хорошо работают, когда вы хотите что-то ближе к более гибкому выражению случая.

Смежные вопросы