Что такое функторы и зачем они нам нужны?

Я не понимаю функторы Фактора. Я думаю, это поможет понять, что такое "функтор".

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 для тебя.

Когда их использовать? Я думаю, что никогда, если у вас нет проблем с производительностью, которые оправдывают их использование. Они очень плохи для восприимчивости.

Другие вопросы по тегам