Haskell, алгоритмы и школа

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

Чтобы получить некоторые линии Haskell под моим поясом, я начал пытаться реализовать некоторые простые algos. Во-первых: Гейл-Шепли для проблемы стабильного брака. Еще не получив монады, все это изменчивое состояние выглядит пугающе, поэтому вместо этого я использовал характеристику стабильных сопоставлений как фиксированных точек отображения на решетке полусогласий. Это было весело, но его уже не Gale-Shapley и сложность не очень приятная (эти цепочки в решетке могут выглядеть довольно долго:)

Далее у меня есть алгоритм для Ближайшей пары точек в плоскости, но я застрял в получении обычной сложности O (n * log n), потому что я не могу понять, как получить подобную набору данных структуру с O (1) проверка членства.

Итак, мой вопрос: может ли вообще реализовать большинство алгоритмов, например. Дейкстра, Форд-Фулкерсон (Gale-Shapley!?), Получая сложности от процедурных реализаций, если лучше получить поддержку Haskell и функционального программирования в целом?

Ответ 1

На это, вероятно, вообще нельзя ответить. Множество стандартных алгоритмов разрабатывается вокруг изменчивости, и переводы существуют в некоторых случаях, а не в других. Иногда существуют альтернативные алгоритмы, которые дают эквивалентные характеристики производительности, иногда вам действительно нужна изменчивость.

Хорошее место для начала, если вы хотите понять, как обращаться к алгоритмам в этой настройке, - это книга Chas Okasaki чисто функциональные структуры данных. Книга представляет собой расширенную версию его диссертации, которая доступна в Интернете в формате PDF.

Если вам нужна помощь по конкретным алгоритмам, например проверка членства O (1) (что фактически вводит в заблуждение - нет такой вещи, такие структуры данных обычно имеют нечто вроде O (k), где k - размер элементов вы будете лучше спрашивать об этом как о конкретном, единственном вопросе, а не о таком общем вопросе.

Ответ 2

Поскольку у вас есть монада ST в Haskell, вы можете делать что-либо с изменчивым состоянием с той же скоростью императивного языка. Внешне он может иметь неравномерный интерфейс. См. Например, Launchbury и Peyton-Jones: "Ленивые потоки функционального состояния" http://portal.acm.org/citation.cfm?id=178246

Ответ 3

Доказательство существования для реализации алгоритмов с изменяемыми структурами данных. Просто повторите запись IO. В этом случае запись игры, содержащая соответствующие переменные.