Подтвердить что ты не робот

Monads VS Аппликативные функции для фьючерсов

Предположим, что я хочу агрегировать данные из 2 удаленных служб и отвечать как можно быстрее:

def loadUser: Future[User]
def loadData: Future[Data]

case class Payload(user: User, data: Data)

Я понимаю, что это выполняет асинхронные задачи последовательно:

for {
  user <- loadUser
  data <- loadData
} yield Payload(user,data)

В то время как это выполняется параллельно, потому что асинхронные задачи запускаются до последовательной привязки:

val userF = loadUser
val dataF = loadData
for {
  user <- userF 
  data <- dataF
} yield Payload(user,data)

Разница, однако, слишком скрыта для меня, и кто-то может не заметить ее вначале.


Применимость также решает задачу

(loadUser |@| loadData) { Payload(_,_) }

Может ли кто-нибудь сказать мне, что я предпочитаю использовать между аппликациями и монадами для выполнения параллельных вычислений асинхронных вычислений? Каковы плюсы и минусы каждого подхода?

4b9b3361

Ответ 1

Итак, я отвечаю на свой вопрос, потому что все комментарии ссылаются на полезные ресурсы.

У Трэвиса Брауна был приятный ответ:

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

Также он указывает на интересный факт:

Жаль, что и Haskell, и Scala в настоящее время делают работу с монадами гораздо более удобной (синтаксически и т.д.), чем работа с аппликативными функторами

Колмар отметил, что можно закрепить 2 фьючерса:

for ((user, data) <- loadUser zip loadData) yield Payload(user, data)

Однако кажется, что скрепление более 2 фьючерсов не настолько изящно.

Итак, кажется, что аппликативный функтор лучше всего подходит для работы, но стандартная библиотека Scala не поощряет нас многого использовать их по сравнению с монадой, и вам нужна дополнительная библиотека, такая как Scalaz или Cats