Понимание Правильного Применения
Для списка, почему right apply (*>) ведет себя как повторение и добавление второго аргумента n раз, где n - длина первого аргумента?
ghci> [1,2,3] *> [4,5]
[4,5,4,5,4,5]
1 ответ:
Оператор
*>по умолчанию определяется какxs *> ys = id <$ xs <*> ys, что, в свою очередь, по умолчанию переводится в
То есть он заменяет каждый элементconst id <$> xs <*> ysxsнаid, чтобы получитьxs', а затем вычисляетxs' <*> ys.[]- это экземплярMonad, где(=<<) = concatMap. Один из законовApplicativeустанавливает связь междуApplicativeиMonadпримерами:pure = return fs <*> as = fs `ap` as = fs >>= \f -> as >>= \a -> f aДля списков это
fs <*> as = [f a | f <- fs, a <- as]Так что
Обратите внимание, что есть еще один очень разумный пример*>для списков в конечном счете определяетсяMonadпример.Applicativeдля списков, который доступен через newtype вControl.Applicative:newtype ZipList a = ZipList [a] instance Applicative ZipList where pure = repeat (<*>) = zipWith ($)