Что такое «контекст» в функции - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь поближе познакомиться с Haskell (Functor, Monad). Поэтому я пытаюсь понять, что происходит в приведенном ниже примере

 sequence:: [f a] -> f [a]
 let list =  [(+2), (*6)]
 let y =  sequence  list

Что такое "f" в (+2) и "значение" y?

1 Ответ

0 голосов
/ 13 сентября 2018

Тип 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, которая создает такой список.

...