Типы данных Haskell Использование хорошие практики

StackOverflow https://stackoverflow.com/questions/4421341

  •  09-10-2019
  •  | 
  •  

Вопрос

Чтение «Real World Haskell», я нашел какой-то интересный вопрос о типах данных:

Этот сопоставление шаблона и доступом к данным и позиционным данным.

Обычно это очень плохая вещь в императивных (особенно OO) языкам ... это не рассматривается как проблема в Haskell? Источник в комментариях RWH

И действительно, написание некоторых программ Haskell, я обнаружил, что когда я делаю небольшое изменение в структуре типа данных, она влияет на почти все функции, которые используют этот тип данных. Возможно, есть несколько хороших практик для использования типа данных. Как я могу минимизировать кодовую муфту?

Это было полезно?

Решение

То, что вы описываете, обычно известен как проблема выражения - http://en.wikipedia.org/wiki/expression_problem..

Существует определенная компромисс, который должен быть сделан, код Haskell в целом, и в частности, типы алгебраических данных, как правило, вдают впадение в трудное, чтобы изменить тип, но легко добавлять функции по типу. Это оптимизирует для (APP-фронта) хорошо продуманного, полного, типов данных.

Все, что сказало, есть ряд вещей, которые вы можете сделать, чтобы уменьшить муфту.

  • Определите хорошие функции библиотеки, определяя полный набор комбинаторов и функций более высокого порядка, которые полезны для взаимодействия с вашим типом данных, вы уменьшите муфту. Часто говорят, что когда вы думаете о сопоставлении с рисунком, существует лучшее решение с использованием функций высшего порядка. Если вы ищете эти ситуации, вы будете в лучшем месте.

  • Раскрыть свои данные структуры как более абстрактных типов. Это означает реализацию всех соответствующих классов типа. Это поможет определить библиотечные функции, поскольку вы получите кучу бесплатно с любым из реализуемых вами классов типа, для примеров смотреть на операции над функтором или монадом.

  • Скрыть (как можно больше) любые конструкторы типа. Конструкторы выставляют детали осуществления и поощряют муфту. Подсказка: эта ссылка с определением хорошего API для взаимодействия с вашим типом, потребители вашего типа должны редко, если когда-либо, должны использовать конструкторы типа.

Общественное сообщество Haskell кажется особенно хорошим в этом, если вы посмотрите на многие из библиотек Hackage, вы найдете действительно хорошие примеры реализации классов в эксплуатации и обнажив хорошие функции библиотеки.

Другие советы

В дополнение к тому, что было сказано:

Один интересный подход - это "Ломка ваша котельная«Стиль определения функций по типы данных, которые используют общие функции (в отличие от явного сопоставления шаблонов), чтобы определить функции над конструкторами типа данных. Глядя на бумаги« Лом вашу котельной », вы увидите примеры функций которые могут справиться с изменениями в структуре типа данных.

Второй метод, как указал Hibberd, должен использовать складки, карта, разворачиваться, И другие рекурсионные комбинаторы, чтобы определить ваши функции. Когда вы пишете функции с использованием функций более высокого порядка, часто небольшие изменения в основном типе данных могут быть решены в объявлениях экземпляра для функтора, складной и так далее.

Во-первых, я хотел бы упомянуть, что на мой взгляд, есть два вида муфт:

  • Тот, который заставляет ваш код перестать компилировать, когда вы меняете один и забудьте изменить другой

  • Тот, который делает ваш код багги, когда вы меняете один и забудьте изменить другой

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

Я думаю, что главная проблема, которую вы упоминаете, связаны с чрезмерными позиционными аргументами. Haskell почти заставляет вас иметь позиционные аргументы в ваших обычных функциях, но вы можете избежать их в продуктах вашего типа (записи).

Просто используйте записи вместо нескольких анонимных полей внутри конструкторов данных, а затем вы можете сформировать - сопоставить любое поле, которое вы хотите выбрать из него, по имени.

bad (Blah _ y) = ...

good (Blah{y = y}) = ...

Избегайте чрезмерного использования кортежей, особенно те, кто за пределы 2-кортежей, и имеет либерально создание записей / NewTypes вокруг вещей, чтобы избежать позиционного значения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top