Uczę się Haskella z przewodnikiem Learn You a Haskell i utknąłem na przykładzie sekwencjonowania aplikacyjnego na liście funkcji. Chapter 11: Functors, Applicative Functors and Monoids definiuje sequenceA być:Jak działa sekwencjonowanie aplikacyjne na liście funkcji?
sequenceA :: (Applicative f) => [f a] -> f [a]
sequenceA [] = pure []
sequenceA (x:xs) = (:) <$> x <*> sequenceA xs
Jestem trochę zawstydzony tym przykładem wykorzystania sequenceA:
> sequenceA [(+3),(+2),(+1)] 3
[6,5,4]
mam rozszerzoną aplikację ręcznie o ile mogę do tego, co uważam, że jest popraw:
(:) <$> (+3) <*> sequenceA [(+2), (+1)]
(:) <$> (+3) <*> (:) <$> (+2) <*> (:) <$> (+1) <*> sequenceA []
(:) <$> (+3) <*> (:) <$> (+2) <*> (:) <$> (+1) <*> pure []
(:) <$> (+3) <*> (:) <$> (+2) <*> (:) <$> (+1) <*> const []
Co nie widzę jednak to, w jaki sposób drugi argument do pierwotnego zastosowania sequenceA, 3
zostanie zastosowany do każdego z częściowo applie d funkcje podane na liście. Byłbym wdzięczny za jakąś pomoc w próbie oblania głowy tym, co dzieje się w ocenie tego oświadczenia.
wskazówka: aplikacyjnych instancja jest '(->) A'. Wypracuj aplikację 'fmap' /' <*> '! – Xeo