Что такое функторы и зачем они нам нужны?
Я не понимаю функторы Фактора. Я думаю, это поможет понять, что такое "функтор".
Google говорит:
функция; оператор.
В Факторе все функции (слова) являются операторами и являются первоклассными. (На самом деле, я не могу думать о многом в Факторе, который не первый класс). Это определение не очень полезно.
Википедия говорит:
Функтор может означать:
- ...
- В компьютерном программировании:
- объект функции, используемый для передачи указателей на функции вместе со своим состоянием
- ...
- В Haskell Functor описывает обобщение функций, которые выполняют операции отображения
Страница для "объекта функции" говорит:
объект, который будет вызван или вызван, как если бы это была обычная функция, обычно с тем же синтаксисом (параметр функции, который также может быть функцией).
Значит, функтор - это первоклассная функция? В этом нет ничего особенного, и в любом случае слова, цитаты и прочее уже являются первоклассными в Факторе.
Факторные Функторы имеют странный синтаксис, который напоминает мне об обобщениях или о чем-то подобном.
ресурс: не поддерживается / модели / комбинаторы / шаблоны / шаблоны.фактор:
FROM: models.combinators => <collection> #1 ;
FUNCTOR: fmaps ( W -- )
W IS ${W}
w-n DEFINES ${W}-n
w-2 DEFINES 2${W}
w-3 DEFINES 3${W}
w-4 DEFINES 4${W}
w-n* DEFINES ${W}-n*
w-2* DEFINES 2${W}*
w-3* DEFINES 3${W}*
w-4* DEFINES 4${W}*
WHERE
MACRO: w-n ( int -- quot ) dup '[ [ _ narray <collection> ] dip [ _ firstn ] prepend W ] ;
: w-2 ( a b quot -- mapped ) 2 w-n ; inline
: w-3 ( a b c quot -- mapped ) 3 w-n ; inline
: w-4 ( a b c d quot -- mapped ) 4 w-n ; inline
MACRO: w-n* ( int -- quot ) dup '[ [ _ narray <collection> #1 ] dip [ _ firstn ] prepend W ] ;
: w-2* ( a b quot -- mapped ) 2 w-n* ; inline
: w-3* ( a b c quot -- mapped ) 3 w-n* ; inline
: w-4* ( a b c d quot -- mapped ) 4 w-n* ; inline
;FUNCTOR
Документация на них крайне скудна. Кто они такие? Когда я должен их использовать?
1 ответ
Не думайте о функторах как о "их называют" функторами ", чтобы раздражать фанатов теории категорий и языковых пуристов".:)
Их использование в основном для генерации шаблонного или шаблонного кода. Точно так же, как шаблоны C++ являются функцией оптимизации, потому что общая диспетчеризация может быть медленной, так же как и функторы Factor.
Пример здесь:
USING: functors io lexer namespaces ;
IN: examples.functors
FUNCTOR: define-table ( NAME -- )
name-datasource DEFINES-CLASS ${NAME}-datasource
clear-name DEFINES clear-${NAME}
init-name DEFINES init-${NAME}
WHERE
SINGLETON: name-datasource
: clear-name ( -- ) "clear table code here" print ;
: init-name ( -- ) "init table code here" print ;
name-datasource [ "hello-hello" ] initialize
;FUNCTOR
SYNTAX: SQL-TABLE: scan-token define-table ;
Теперь вы можете написать SQL-TABLE: person
и фактор будет создавать слова clear-person
, init-person
а также person-datasource
для тебя.
Когда их использовать? Я думаю, что никогда, если у вас нет проблем с производительностью, которые оправдывают их использование. Они очень плохи для восприимчивости.