Мы можем для каждой строки получить k
-й элемент, поэтому мы можем выполнить отображение, например:
romMatrix :: [[a]] -> Int -> [a]
rowMatrix m k = map (!! k) m
Или для типа Matrix
:
Итак, здесь мы создаем список элементов, каждый из которых является k
-ым элементом соответствующего подсписка.
graphviz является очень очень простым языком/форматом для создания графиков. Если бы возможности достаточно для Вас, я рекомендовал бы это (Его столь легкий, что я оценил бы, что время учится с самое большее 1 часом).
Graphviz не собирается давать Вам гладкий графический интерфейс как Visio. Это будет однако, производить хорошо размеченные графики. Я нахожу это самым полезным, когда я генерирую графики автоматически с помощью программы (как в случае doxygen).
Graphviz является самым полезным для генерации графов зависимостей (через точку) программно. Посетители использование это для визуализации посещений площадки; Hadoop/Cascading использует, он для визуализации плана выполнения карты - уменьшает задания.
Я использую GraphViz экстенсивно для документации и часто изображаю схематически использование отношений или схем архитектуры, GraphViz внешне затем добавляют их к дополнительным страницам в моем коде Doxygen с помощью @dot / enddot. Я также недавно начал использовать @dotfile, который обладает двойным преимуществом хранения больших точечных операторов из документов кода и разрешения мне продолжить предварительно просматривать их с GraphViz GUI.
другое большое преимущество с GraphViz - то, что простой текстовый формат работает очень хорошо с управлением версиями. Вы видите изменения в схемах в Вашей разности мерзавца, которая была бы невозможна с любым двоичным форматом документации. Поскольку я использовал его больше больше за эти годы, это становится более важной функцией мне.
Однако для UML я использую истинный инструмент UML ( Архитектор Предприятия ) вместо того, чтобы наполнить вокруг в Visio.
Да, graphviz легко изучить и простой в использовании из программ.
Также взгляд yEd, который является хорошим инструментом для работы с графиками. В отличие от Visio, это загрузит и сохранит множество форматов, которые легки к ручному редактированию или programatically-генерируют. Материал автоматической компоновки довольно хорош также.
Я иногда использовал его для иллюстрирования конечных автоматов. graphviz идеально подходит для этого.
Согласитесь с согласием здесь; я вытаскиваю много значения из Graphviz. Это действительно хорошо для создания простого, и не настолько простое, схемы. Разработчики программного обеспечения склонны притягивать графики, не только в исходном коде, но и в другом месте также.
, Например, прямо сейчас в другом окне браузера, у меня есть ветвление нашей группы, и слияние стратегии проиллюстрировало использование схемы graphviz (отображенное использование плагин слияния BTW).
Graphviz хорош для UML также. См. это учебное руководство ; это - хорошее введение в Graphviz также.
Мы используем graphviz для автоматического создания диаграмм объектов в качестве обратной связи нашего инструмента проверки UML. Мы действительно довольны результатами, так как нам удается обеспечить графический результат, не беспокоясь о макете.
Если вы просто говорите о создании диаграмм наследования / сотрудничества, как это делает Doxygen, стоит изучить IDE, которые сделают это за вас автоматически. Для создания документации с нуля или вручную я использую OmniGraffle (так как я использую Mac), который я настоятельно рекомендую.
Однако GraphViz и DOT может быть действительно полезен не только для документации, но и для отладки и понимания кода, особенно для структур данных. Обычно я не пишу DOT вручную, но автоматически сгенерированные DOT могут стоить минимальных усилий.
Одно из мест, где я нашел GraphViz чрезвычайно полезным, - это понимание и отладка алгоритмов двоичного дерева поиска. Разрабатываю CHDataStructures.framework , фреймворк Objective-C с открытым исходным кодом, который включает несколько разновидностей BST. Я реализовал два метода: - (NSString *) dotGraphString
в родительском классе и - (NSString *) dotGraphStringForNode:
в каждом дочернем классе. Примерно в 30-40 строк кода (большая часть в нижней части CHAbstractBinarySearchTree.m
) я добавил возможность итеративно обходить двоичное дерево и создавать его DOT-представление, включая информацию о балансировке, раскрашивание красные или черные узлы и т. д. (При небольшой осторожности вы можете легко представить нулевые контрольные узлы и отобразить дерево в правильном отсортированном порядке.)
В моем тестовом коде после каждой модификации дерева я вызвал - dotGraphString
и сохранил результат в файл .dot, остановился там с помощью точки останова, затем открыл этот файл с помощью GraphViz, который достаточно умен, чтобы повторно отобразить график DOT при обновлении файла. Такой подход значительно упростил просмотр того, что происходит в дереве, и обнаружение ошибок в моей реализации данного алгоритма. Этот подход можно довольно легко адаптировать для различных типов структур данных, и, как правило, он намного быстрее и проще, чем создание пользовательского интерфейса только для визуализации структуры.