Построение иерархии классов виджета графического интерфейса является в значительной степени стандартным упражнением в объектно-ориентированном программировании. У вас есть своего рода абстрактный класс Widget
с абстрактным подклассом для виджетов, который может содержать другие виджеты, а затем у вас есть избыток дополнительных абстрактных классов для виджетов, поддерживающих текстовый дисплей, виджеты, которые поддерживают фокус ввода, виджеты, которые имеют логическое состояние, вплоть до конкретных конкретных классов, таких как кнопки, ползунки, полосы прокрутки, флажки и т.д.
Мой вопрос: каков наилучший способ сделать это в Haskell?
Есть ряд вещей, которые затрудняют создание GUI Haskell, но не являются частью моего вопроса. Выполнение интерактивного ввода-вывода слегка затруднительно в Haskell. Реализация GUI почти всегда означает запись обертки в крайне низкоуровневую библиотеку C или С++. И люди, пишущие такие обертки, имеют тенденцию копировать существующий API дословно (предположительно, так, чтобы кто-нибудь, кто знает обернутую библиотеку, будет чувствовать себя как дома). На данный момент эти проблемы меня не интересуют. Меня интересует только то, как лучше всего моделировать полиморфизм подтипа в Haskell.
Какие свойства мы хотели бы получить от нашей гипотетической библиотеки GUI? Ну, мы хотим, чтобы в любое время можно было добавлять новые типы виджетов. (Другими словами, закрытый набор возможных виджетов не подходит). Мы хотим минимизировать дублирование кода. (Существует много типов виджетов!) В идеале мы хотим, чтобы при необходимости могли оговаривать один конкретный тип виджетов, а также иметь возможность обрабатывать коллекции любого типа виджетов, если это необходимо.
Все вышесказанное, конечно, тривиально в любом уважающем себя языке OO. Но каков наилучший способ сделать это в Haskell? Я могу придумать несколько подходов, но я не уверен, какой из них был бы "лучшим".