Понимание Правильного Применения


Для списка, почему right apply (*>) ведет себя как повторение и добавление второго аргумента n раз, где n - длина первого аргумента?

ghci> [1,2,3] *> [4,5]
[4,5,4,5,4,5]
1 4

1 ответ:

Оператор *> по умолчанию определяется как

xs *> ys = id <$ xs <*> ys

, что, в свою очередь, по умолчанию переводится в

const id <$> xs <*> ys
То есть он заменяет каждый элемент xs на 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 ($)