2016-06-09 2 views
2

Я не понимаю Factor's functors. Думаю, это поможет понять, что такое «функтор».Что такое функторы и зачем они нам нужны?

Google говорит:

функция; оператора.

В Factor все функции (слова) являются операторами и являются первоклассными. (На самом деле, я не могу думать о многом в Факторе, что не первый класс). Это определение не так полезно.

Википедия говорит:

Functor может означать:

  • ...
  • В компьютерном программировании:
    • функциональный объект используется для передачи указателей на функции наряду с его состоянием
    • ...
    • В Haskell Функтор описывает обобщение функций, которые выполняют операции отображения

Страница для "функции объекта" говорит:

объект, который нужно вызвать или вызвать, как если бы он был обычной функцией, обычно с тем же синтаксисом (параметр функции, который также может быть функцией).

Итак, функтор является первоклассной функцией? Это ничего особенного, и любые слова, цитаты и прочее уже являются первоклассными в Factor.

Фактор Функторы имеют странный синтаксис, который напоминает мне дженерики или что-то в этом роде.

resource:unmaintained/models/combinators/templates/templates.factor:

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 

документация крайне скудны на них. Кто они такие? Когда я должен их использовать?

ответ

2

Не думайте функторов, что 'They're named "functors" to annoy category theory fanboys and language purists.' :)

Их использование в основном для создания шаблонного или код шаблона. Подобно тому, как шаблоны 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 для вас.

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

+0

О, черт возьми, это действительно круто ... – cat

Смежные вопросы