Интересно, существуют ли функции bind2, bind3 и т. Д., Определенные где-то в стандартных пакетах?Есть ли bindN в библиотеках по умолчанию?
bind2 :: (Monad m, Applicative m) => (a -> b -> m c) -> m a -> m b -> m c
bind2 f a b = join (liftA2 a b)
Почему я хочу этого? Потому что я хочу уменьшить привязки до минимума. Например, если мы используем бесплатную монады подход для создания автоматически параллельных вычислений асинхронное, или выбирает, как и в Haxl:
fetchForSuggestions :: Artist -> [Like] -> Async [Suggestions]
fetchForSuggestions = error "implement me"
-- Two binds!
action :: ArtistId -> UserId -> Async [Suggestions]
action artistId userId = do
artist <- fetchArtist artistId
likes <- fetchUserLikes userId
fetchForSuggestions artist likes
-- Single bind
-- here artist and user likes could be fetched concurrently
action :: ArtistId -> UserId -> Async [Suggestions]
action artistId userId = bind2 fetchForSuggestions (fetchArtist artistId) (fetchUserLikes userId)
Am I представляя своего рода анти-шаблон здесь? Если я пытаюсь сделать:
complexAction :: ParamA -> ParamB -> ParamC -> Async Result
complexAction a b c = do
(x, y, z) <- (,,) <$> subActionX a b <*> subActionY b c <*> subActionZ c a
(i, j, k) <- (,,) <$> subActionI a x <*> subActionJ b y <*> subActionK c z
finalAction i j k x y z
subAction
, где каждая функция связывания свободной? То есть удалить action
принимая ArtistId
и UserId
, и оставить только fetchForSuggestions
?
Похоже, вы могли бы воспользоваться функцией '{- # LANGUAGE ApplicativeDo # -}'. :) https://ghc.haskell.org/trac/ghc/wiki/ApplicativeDo –