Понимание Правильного Применения
Для списка, почему 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 <*> 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 ($)