Я пытаюсь понять взаимосвязь между шаблонами взглядов и стражками шаблонов в GHC. Шаблоны охранников кажутся довольно интуитивными, в то время как шаблоны представления кажутся немного запутанными. Это похоже на то, что шаблоны просмотра лучше справляются с вещами глубоко в шаблоне, в то время как шаблоны могут повторно использовать представление более интуитивно, но я не совсем понимаю его.Просмотр шаблонов против стражей шаблонов
ответ
Просмотреть рисунки имеют значительное перекрытие с защитными элементами. Основное преимущество шаблонов представлений заключается в том, что они могут быть вложенными и избегать введения промежуточных переменных шаблона. Для глупого примера:
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
и защищает менее повторяющийся, чем эквациональный стиль.
Просмотреть шаблоны, чтобы вы проецировали значение перед сопоставлением с шаблоном. Это почти можно рассматривать как короткий путь для
foo x = case f x of
...
Там немного сахара на вершине для работы с более сложными видами, но в основном это все. С другой стороны, модели охранники строго более общим,
- Они могут включать в себя произвольные логические условия для согласования
- Они могут совпадать с использованием более чем одной из переменных
Я предпочитаю вид модели, когда Я делаю что-то «линзоподобное». У меня есть большой объем данных, и меня интересует один конкретный взгляд на него. Например, с объективом
foo (view someLens -> Bar baz quux) = ...
Устройства защиты от травм, как правило, хорошо работают, когда вы хотите что-то ближе к более гибкому выражению случая.
- 1. C++ 11 псевдонимы шаблонов шаблонов против оберток
- 2. BackboneJS - Просмотр внешних шаблонов
- 3. Функционалы шаблонов против функций
- 4. Предварительный просмотр шаблонов Asp.Net 5
- 5. Сопоставление шаблонов против Простое совпадение
- 6. Компоненты против шаблонов в нокаутJS?
- 7. Строгость сопоставления шаблонов против деконструирования
- 8. Проверка кода против шаблонов шаблонов с использованием отражения
- 9. Редактирование шаблонных файлов шаблонов шаблонов Magento против макета
- 10. получить N-го типа шаблонов шаблонов шаблонов?
- 11. Основы шаблонов шаблонов C++
- 12. Шаблоны шаблонов шаблонов
- 13. Проверка типов шаблонов шаблонов
- 14. создание шаблонов шаблонов в asp.net
- 15. Дизайн шаблонов для взаимозависимых шаблонов?
- 16. VS2015 Ошибка шаблонов шаблонов Variadic?
- 17. Играйте! Группы параметров шаблонов шаблонов
- 18. Обновление шаблонов шаблонов форм 3
- 19. Использование шаблонов шаблонов admin Django
- 20. Regex - тестирование против двух разных шаблонов
- 21. Ручки: Частицы против помощников для шаблонов
- 22. Передние шаблоны против шаблонов задней панели
- 23. Символ потока символов против динамических шаблонов
- 24. Фасад против шаблонов адаптеров для встроенных систем
- 25. Шаблоны предметов против шаблонов деталей в Orchard
- 26. Абстрактные классы против шаблонов - хорошие практики
- 27. Специализация класса шаблонов против перегрузки функций
- 28. Загрузить директорию шаблонов шаблонов в Twig
- 29. Загрузка и повторное использование шаблонов шаблонов Django
- 30. Как определения шаблонов совпадают с объявлениями шаблонов?