Необходимо сначала понять, каков функтор. Перед этим поймите функции высшего порядка.
А функция высшего порядка является просто функцией, которая берет функцию в качестве аргумента.
А функтор является любой конструкцией типа T
, для которого там существует функция высшего порядка, назовите его map
, который преобразовывает функцию типа a -> b
(учитывая любые два типа a
и b
) в функцию T a -> T b
. Этот map
функция должна также повиноваться законам тождества и составу, таким образом, что следующие выражения возвращают true для всего p
и q
(нотация Haskell):
map id = id
map (p . q) = map p . map q
, Например, конструктор типа звонил List
, функтор, если к нему прилагается функция типа (a -> b) -> List a -> List b
, который подчиняется законам выше. Единственная практическая реализация очевидна. Получающееся List a -> List b
функция выполняет итерации по данному списку, звоня эти (a -> b)
функция для каждого элемента, и возвращает список результатов.
А монада является по существу просто функтором T
с двумя дополнительными методами, join
, типа T (T a) -> T a
, и unit
(иногда называемый return
, fork
, или pure
) типа a -> T a
. Для списков в Haskell:
join :: [[a]] -> [a]
pure :: a -> [a]
, Почему это полезно? Поскольку Вы могли, например, map
по списку с функцией, которая возвращает список. Join
берет получающийся список списков и связывает их. List
монада, потому что это возможно.
можно записать функцию, которая делает map
, тогда join
. Эта функция вызвана bind
, или flatMap
, или (>>=)
, или (=<<)
. Это обычно, как пример монады приведен в Haskell.
монада А должна удовлетворить определенные законы, а именно, это join
должно быть ассоциативно. Это означает, что, если у Вас есть значение x
из типа [[[a]]]
тогда join (join x)
, должен равняться join (map join x)
. И pure
должны быть идентификационные данные для [1 138] таким образом что join (pure x) == x
.
В спецификации SVG просто говорится, что вы можете использовать URI - так что это должно быть возможно. Поддержка браузера, конечно, другое дело.
Я только что написал и протестировал небольшой образец файла.
Он не работает в Inkscape, но он действительно работает с Apache Batik Toolkit.
Для поддержки браузера, Я загрузил файл на browsershots.org и резюмирую его: некоторые браузеры поддерживают внешние градиенты, некоторые - нет. e.g.:
Если я правильно понял, измените URL-адрес на
<rect fill="url(grad.svg?param=my_grad" />
А затем динамически сгенерировать SVG?