Тип sequenceA
:
sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)
(я использую sequenceA
, потому что это более общая версия - sequence
имеет более ограничительное ограничение Monad
вместо Applicative
, но, насколько это касается ответа, это не так не имеет большого значения.)
Допустим, ваш list
имеет тип [Integer -> Integer]
(для ясности я специализирую числа). Тогда sequenceA
в sequenceA list
специализируется на:
[Integer -> Integer] -> (Integer -> [Integer])
Соответствие легче увидеть, если мы напишем интересные (для нас здесь) конструкторы типов в префиксном стиле :
-- t ( f a) -> f ( t a)
[] ((->) Integer Integer) -> ((->) Integer ([] Integer))
Функтор списка, []
, является проходимым функтором (t
в сигнатуре sequenceA
), в то время как (->) Integer
, functions-from- Integer
функтор, является соответствующим аппликативным функтором (f
в подписи) или, если использовать язык вашего названия, соответствующим аппликативным контекстом. Например, в типе результата Integer -> [Integer]
вместо простого списка целых чисел имеется функция из Integer
s, которая создает такой список.