To jest kontynuacja mojego poprzedniego question. Skopiowałem poniższy przykład z HaxlJak korzystać z aplikacji do współbieżności?
Załóżmy, że pobieram dane z serwera blogu, aby wyświetlić stronę blogu, która zawiera najnowsze posty, popularne posty i tematy postów.
Mam następujące dane na pobieranie API:
val getRecent : Server => Seq[Post] = ...
val getPopular : Server => Seq[Post] = ...
val getTopics : Server => Seq[Topic] = ...
teraz muszę je komponować do wdrożenia nowej funkcji getPageData
val getPageData: Server => (Seq[Post], Seq[Post], Seq[Topic])
Haxl sugeruje użycie nowego monady Fetch
aby API composable .
val getRecent : Fetch[Seq[Posts]] = ...
val getPopular : Fetch[Seq[Posts]] = ...
val getTopics : Fetch[Seq[Topic]] = ...
Teraz mogę określić moje getPageData: Fetch[A]
z monadycznego skład
val getPageData = for {
recent <- getRecent
popular <- getPopular
topics <- getTopics
} yield (recent, popular, topics)
ale to nie działa getRecent
, getPopular
i getTopics
jednocześnie.
Haxl wskazują pomocą aplikacyjnych kompozycji <*>
komponować „jednoczesne” działania (czyli funkcje, które mogą być uruchamiane jednocześnie). Więc moje pytania to:
- Jak wdrożyć
getPageData
zakładającFetch[A]
jestApplicative
? - Jak zaimplementować
Fetch
jakoApplicative
, ale nie pod numeremMonad
?
dzięki. Nie znam 'Haskella', dlatego właśnie pytam ... Czy definiujesz' Fetch [A] 'jako rekord z polem' runFetch' typu 'IO [A]'? – Michael
To prawda, Fetch [A] ma rekordowy wynik run, który jest IO [A]. A więc Fetch [A] to po prostu nowa nazwa dla IO [A], co pozwala nam podać nowe definicje '>> =' i '<*>. –
Jeszcze raz dziękuję. Myślę, że rozumiem. BTW 'Haxl' inaczej definiuje' Fetch', postaram się przeczytać ponownie i prawdopodobnie zadam więcej pytań tutaj. – Michael