# Hook

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
 `⍛` `⍩`

Hooks (`⍛`, `⍩`) are asymmetrical forms of function composition that first apply one of the composed functions to one argument, then applies the other function to one argument and the result. Kap has the two operators Compose (`∘`) and Inverse compose (`⍛`). BQN has Before (`⊸`) and After (`⟜`), which also serve the purpose of the Bind operator. In J, a 2-train is a hook, while I adds the mirror image to give two functions (I has first-class functions but no operators) hook (`h`) and backhook (`H`).

Hook as an operator first appeared in A Dictionary of APL as Withe (`⍩`). However, Iverson and McDonnell's paper Phrasal Forms, which introduced trains[1], proposed hook as the meaning of a 2-train, and this was soon included in J. This definition specifies that `(F G) y` is `y F G y` and `x (F G) y` is `x F G y`. However, Roger Hui later opined that this definition was better suited to a dyadic operator (which could be denoted `h.`) than an element of syntax,[2] and defined the 2-train to represent Atop instead when he led the introduction of trains to Dyalog APL. By that time, Dyalog had long had the Beside (originally called Compose) operator which is equivalent to `x F h. G y`, that is, the dyadic case. The monadic functionality can be achieved using Commute as `F∘G⍨y` and the full ambivalent function can be written as `F∘G⍨⍨`.

Hook operators in BQN

In order to maintain symmetry, Kap changes the meaning of `∘` to be a proper hook, and thus aligns itself with I and BQN, which also have two hooks. Kap defines Compose (`∘`) to be the dyadic operator `{⍺←⍵ ⋄ ⍺ ⍺⍺ ⍵⍵ ⍵}` and Inverse Compose (`⍛`) to be `{⍺←⍵ ⋄ (⍺⍺ ⍺) ⍵⍵ ⍵}`. In the dyadic case these operators are identical to Beside and Reverse Compose respectively, but in the monadic case, `∘` differs from Beside because the argument is used twice: the second function application takes it as an argument directly in addition to the result of the first function application.

The two hooks can be used together to form a split-compose construct:

```    3 ¯1 4 ×⍛×∘| ¯2 ¯7 1
2 ¯7 1
```
Works in: Kap

This definition behaves differently that the Compose-based one when only one argument is given; in that case, it becomes a monadic 3-train.

The name "hook" was chosen based on the hook shape of a function call diagram such as the one below, taken from Phrasal Forms.

```⍺(fg)⍵ ←→ ⍺fg⍵

f
/ \
⍺   g
\
⍵
```