Монады и актеры

Я пытался найти что-то, что обсуждает, когда вы должны отдавать предпочтение использованию монад над актерами (в сценариях параллелизма), но я ничего не нашел. В частности, меня интересует использование Reactive Extensions (LINQ to Events) против F # MailboxProcessor. Пожалуйста, приведите примеры в дополнение к вашим философским рассуждениям.

Обновление Для лучшего контекста, Реактивные Расширения реализуют монаду продолжения в форме IObservable / IObserver. Я не обязательно говорю, что должен использовать F #, просто у F # есть конкретная «модель актора», доступная на языке .NET в форме MailboxProcessor <'T>.

Я пытаюсь понять, когда использовать монаду (в данном случае монаду продолжения) против актерской модели для целей параллелизма. Там, где монада (насколько я понимаю) не вводит состояние, у субъекта есть собственное внутреннее состояние, которое изменяется по мере необходимости для обеспечения защищенного доступа.

Я видел несколько примеров использования обоих: Rx и node .js (CPS, на самом деле не монада продолжения) против F # MailboxProcessor и платформы Scala Akka. Я просто не знаю, почему вы выбрали бы один из других.

7
задан 7 February 2011 в 20:21
поделиться

2 ответа

Простите меня за новичок, я только изучаю F#.

Мне интересно увидеть использование RX вместо MailboxProcessor, если у вас есть ссылки на соответствующие материалы.

С моим ограниченным пониманием; Я бы выбрал MbP в своем собственном коде, поскольку события немного запутаны для настройки в F # (из того, что я могу взять из этой статьи: MSDN ). И вам нужны события для RX, чтобы подключиться, верно?

Где, как и в случае с MbP, все, что мне нужно, — это размеченное объединение сообщений, список функций, которые я хочу выполнить при получении данного сообщения. И процессор почтового ящика, который этим занимается.

В коде все это выглядит довольно аккуратно. Я могу объединить свои MbP в модуль, тогда мой «объектный» модуль выглядит как

  • Record
  • Message DU
  • Wrapper с некоторыми геттерами и сеттерами, которые отправляют данные в MbP

Для меня это выглядит много. аккуратнее, чем если бы я написал свой код с событиями, как описано в той статье MSDN, на которую я ссылался.

Хотя я всего лишь младший F#, так что я могу ошибаться в своих расчетах, и это скорее внешний вид, чем выбор соответствия цели (поскольку я не квалифицирован, чтобы сделать это вызов , пока)

1
ответ дан 7 December 2019 в 09:55
поделиться

Я не уверен, что вопрос имеет смысл в такой формулировке - существует много разных монад (например, монада identity, монада list, монада option, ...), большинство из которых не имеют ничего общего с параллелизмом. Кроме того, было бы полезно узнать больше о конкретном сценарии, с которым вы имеете дело - "параллелизм" - это немного туманная тема. В зависимости от того, чего вы пытаетесь достичь, лучшим выбором могут быть рабочие процессы F# async (которые построены на монаде Async).

Если вы используете F#, я бы не рекомендовал напрямую использовать LINQ-to-anything, поскольку эти библиотеки выглядят очень чуждо при доступе через F#. Однако вы можете создать удобные оболочки F# (например, существующие модули Seq и Observable). Кроме того, для монадических типов вы можете создать построитель вычислительных выражений (например, вы можете создать построитель с помощью Reactive Extensions, который позволит вам использовать вычислительные выражения для построения и составления IObservable).

4
ответ дан 7 December 2019 в 09:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: