Serguey Zefirov (thesz) wrote,
Serguey Zefirov
thesz

Размышление. Программистское.

В некоей программе на Хаскеле получается не меньше двух монад: GTK и БД (БД собственная). А может получится и больше (пять-шесть штук). Практически все они как-то связаны с IO, имеют состояния различного рода и могут бросать исключения.

Как я понимаю, собрать их воедино не то, чтобы невозможно, а просто достаточно трудно.

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

То есть, я формирую запрос вида HeroMonad FeatResult и отправляю по heroChannel, вместе с каналом, куда класть ответ (заведенным только что специально для этого случая). heroThread слушает heroChannel, читает действие и выполняет его. По выполнению она мне выдаст результат в только что переданный канал.

Получается дизайн комбинатора, которому только и надо, что интерфейс MonadIO.

Таким же образом я могу сделать SidekickMonad и VillainMonad, вместе с соответствующими каналами. Получится комикс. ;)

Главное, что обнаружил ещё одно измерение, в котором можно развивать дизайн программ на Хаскеле.

PS
Освоил Monad Transformers. Отличная штука.
PPS
На мысль об использовании каналов натолкнула небольшая дискуссия в ru_lambda.
Tags: Хаскель, программирование
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 14 comments