Ответ 1
"Использует ли свободная групповая монада какое-либо программирование?"
Из-за отсутствия ответов за последние четыре месяца, я полагаю, что ответ "нет, а не действительно". Но это интересный вопрос, и поскольку он основан на фундаментальных математических концепциях, мне кажется (также), что он должен.
Вначале я отмечаю, что предлагаемая функциональность бесплатной группы также может быть легко реализована с помощью списка A или
type FreeGroupT a = [Either a a]
fgTofgT :: FreeGroup a -> FreeGroupT a
fgTofgT Nil = []
fgTofgT (a :+: as) = Right a : fgToList as
fgTofgT (a :-: as) = Left a : fgToList as
fgTTofg :: FreeGroupT a -> FreeGroup a
fgTTofg [] = Nil
fgTTofg (Right a : as) = a :+: fgTTofg as
fgTTofg (Left a : as) = a :-: fgTTofg as
--using (:-:) instead of NegCons
--and (:+:) instead of PosCons
Это хорошее определение, так как мы гарантируем, что наша свободная группа является просто моноидом с небольшой дополнительной структурой. Он гласит, что свободная группа - это всего лишь композиция свободного моноида с другим функтором (какое имя? Нет, либо b bifunctor, но и функтор F a = L a | R a). Мы также гарантируем, что экземпляр монады свободной группы согласуется с экземпляром монады свободного моноида. То есть, монады свободной группы, которые действуют на условиях, которые все бывают положительными, должны вести себя как монады над свободным моноидом, правильно?
В конечном счете, однако, если мы хотим уменьшить обратные, нам нужен экземпляр Eq a
. Нам нужно будет работать на уровне термина, чистая информация о типе уровня недостаточно. Это делает различие уровня между свободным моноидом и свободной группой бесполезным - насколько я могу видеть. По крайней мере, без зависимого набора текста.
В целях обсуждения фактических применений программного обеспечения я попытаюсь (но не обязательно) предоставить правдоподобный вариант использования.
Представьте текстовый редактор, который использует клавишу "Ctrl", чтобы сигнализировать последовательности команд. Любая последовательность клавиш, нажатая при удерживании "Ctrl", моделируется как негативы (отрицательные минусы (: -:)) в FreeGroup. Таким образом, свободный член группы 'a':+:'b':+:'b':-:'a':-:[]
может использоваться для моделирования поведения emacs, который записывает "ab", перемещает курсор назад символ, а затем в начало строки. Такой дизайн приятный. Мы можем легко вставлять команды и макросы в поток без каких-либо специальных зарезервированных escape-символов.
Однако этот пример не подходит для правильного использования, так как мы ожидаем, что 'a':+:'b':+:'b':-:'a':-:[]
будет той же программой, что и []
, а это не так. Более того, его достаточно просто, чтобы просто обернуть каждый член списка в Либо, как описано выше.