Стеклопластиковые каркасы и ИО


Я только что исследовал FRP в Haskell (главным образом reactive-banana (отзывы!)), и мне интересно, является ли это общим для них, и в случае реактивного банана, какова причина работать в IO монаде вместо того, чтобы ограничиваться MonadIO, или лучше rven, любой Monad (чтобы я мог обеспечить собственный стек)?

Мне кажется, что это из-за фокуса на GUI-программировании, где вы интегрируете его с некоторыми существующими библиотеками, которые работают в IO? Было бы возможно изменить его так, чтобы я мог интегрировать его с пользовательским стеком монад?

1 10

1 ответ:

Если вы спрашиваете, почему

reactimate :: Frameworks t => Event t (IO ()) -> Moment t ()

Ожидает событие со значениями типа IO () вместо того, чтобы разрешить пользовательскую монаду M () с instance MonadIO M, тогда ответ таков:

На практике пользовательские стеки монад только добавляют эффекты состояния / чтения / записи к базовой монаде IO. Тем не менее, теоретически, вполне возможно добавить причудливый механизм управления, такой как сорутинги или недетерминизм. Я не знаю, как интегрировать внутреннее состояние, возникающее из комбинаторов accumE с этими более общими и я понятия не имею, что означает событие, происходящее в недетерминированном контексте. Вот почему reactimate ограничивается IO.

Если у вас есть пользовательский стек монад, который относится к семейству state/reader/writer, то обычно можно сопоставить его с чистым вычислением IO и использовать его с reactimate. Если вы обнаружите, что это не сработает (я действительно думаю, что может возникнуть проблема), мне потребуется более подробное описание конкретной ситуации, чтобы быть в состоянии помочь.