Что значит для значения "иметь функтор"?
Я новичок в этом, и я могу упустить что-то важное. Я прочитал первую часть " Теории категорий для программистов", но самой абстрактной математикой, которую я сделал в университете, была "Теория групп", поэтому мне приходится читать очень медленно.
В конечном счете, я хотел бы понять теорию, чтобы обосновать свое использование техник, поэтому всякий раз, когда я чувствую, что достиг некоторого прогресса, я возвращаюсь к спецификации Fantasy-Land, чтобы проверить себя. На этот раз я чувствовал, что знаю, с чего начать: я начал с Functor.
Из спецификации фэнтезийной земли:
Функтор
u.map(a => a)
эквивалентноu
(Идентичность)u.map(x => f(g(x)))
эквивалентноu.map(g).map(f)
(состав)
map
методmap :: Functor f => f a ~> (a -> b) -> f b
Значение, имеющее Functor, должно предоставлять метод карты. Метод map принимает один аргумент:
u.map(f)
f должно быть функцией,
я. Если f не функция, поведение map не определено.
ii.f может вернуть любое значение.
III. Части возвращаемого значения f не должны проверяться.
карта должна возвращать значение того же функтора
Я не понимаю фразу "значение, которое имеет функтор".
Что значит для значения "иметь функтор"? Я не думаю, что "является функтором" или "принадлежит функтору", имело бы здесь больше смысла.
О чем пытается сказать документация u
?
Насколько я понимаю, функтор - это отображение между категориями (или в данном случае из категории в себя). Мы работаем в категории типов, в которой объекты - это типы, а морфизмы - это семейства функций, которые переносят тип в другой тип или тип в себя.
Насколько я могу судить, функтор карты a
в Functor a
, У него есть какой-то конструктор, как,
Functor :: a -> F a
и функция карты, как,
map :: Functor f => (a -> b) -> f a -> f b
a
относится к любому типу и семейству функций (a -> b)
относится ко всем морфизмам, указывающим на любой конкретный тип a
для любого другого конкретного типа b
, Так что мне даже не имеет смысла проводить различие между значениями, которые имеют или не имеют "функтор", потому что если существует хотя бы один функтор, то он существует "для" каждого типа... так что каждое значение может быть отображено функцией, которая принадлежит морфизму между двумя типами, который был поднят функтором. Я имею в виду следующее: пожалуйста, покажите мне пример значения, у которого "нет функтора".
Функтор - это отображение; это не тот тип F a
и это не значения типа F a
, Так что в документах значение u
это не функтор, и я не думаю, что он "имеет" функтор... это значение типа F a
,
1 ответ
Как вы говорите, функтор в программировании - это отображение между типами, но в JavaScript нет типов, поэтому вы должны их представить. Вот представь, что функция f
идет от типа a
печатать b
, Значение u
является результатом какого-то функтора F
действующий на a
, Результат u.map(f)
имеет тип F b
так что у вас есть отображение из F a
(это тип u
) чтобы F b
, Вот, map
рассматривается как метод u
,
Это как можно ближе к функтору в JavaScript. (Это не помогает, что то же письмо f
в качестве альтернативы используется для функции и функтора в документации.)