Hook: Difference between revisions

From APL Wiki
Jump to navigation Jump to search
(Style changes to use APL instead of language-specific terminology)
(Use pre instead of source tags to avoid highlighting errors)
Line 8: Line 8:


Like [[Reverse Compose]], the two hooks can be used together to form a [[split-compose]] construct.
Like [[Reverse Compose]], the two hooks can be used together to form a [[split-compose]] construct.
<source>
<pre>
     3‿¯1‿4 ×⊸×⟜| ¯2‿¯7‿1
     3‿¯1‿4 ×⊸×⟜| ¯2‿¯7‿1
⟨ 2 ¯7 1 ⟩
⟨ 2 ¯7 1 ⟩
</source>{{Works in|[[BQN]]}}
</pre>{{Works in|[[BQN]]}}
This definition behaves differently that the Compose-based one when only one argument is given: in that case, it becomes a monadic 3-[[train]].
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''.
The name "hook" was chosen based on the hook shape of a function call diagram such as the one below, taken from ''Phrasal Forms''.
<source>
<pre>
⍺(fg)⍵ ←→ ⍺fg⍵
⍺(fg)⍵ ←→ ⍺fg⍵


Line 23: Line 23:
         \
         \
         ⍵
         ⍵
</source>
</pre>


== See also ==
== See also ==

Revision as of 20:41, 8 February 2021

Hook operators in BQN

A hook is an asymmetrical form of function composition that first applies one of the composed functions to one argument, then applies the other function to one argument and the result. 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). BQN uses two operators Before () and After (), which also serve the purpose of the Bind operator.

The meaning of 2-train as hook was first proposed in Iverson and McDonnell's paper Phrasal Forms introducing trains[1], and 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 than an element of syntax,[2] and defined to 2-train to represent Atop instead when he led the introduction of trains to Dyalog APL.

In I and BQN, there are two hooks in order to maintain symmetry: for example, BQN defines Before () to be the dyadic operator {(𝔽𝕨⊣𝕩)𝔾𝕩} ("𝔾's left argument comes from 𝔽") and After () to be {(𝕨⊣𝕩)𝔽𝔾𝕩} ("𝔽's right argument comes from 𝔾"). In the dyadic case these functions are identical to Reverse Compose and Beside respectively, but in the monadic case they differ 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.

Like Reverse Compose, the two hooks can be used together to form a split-compose construct.

    3‿¯1‿4 ×⊸×⟜| ¯2‿¯7‿1
⟨ 2 ¯7 1 ⟩
Works in: BQN

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
        \
         ⍵

See also

External links

References

  1. Ken Iverson and Eugene McDonnell. Phrasal forms at APL89.
  2. Roger Hui. Hook Conjunction?. J Wiki essays. 2006. Accessed 2021-02-08.
APL built-ins [edit]
Primitive functions
Scalar
Monadic ConjugateNegateSignumReciprocalMagnitudeExponentialNatural LogarithmFloorCeilingFactorialNotPi TimesRollTypeImaginarySquare Root
Dyadic AddSubtractTimesDivideResiduePowerLogarithmMinimumMaximumBinomialComparison functionsBoolean functions (And, Or, Nand, Nor) ∙ GCDLCMCircularComplexRoot
Non-Scalar
Structural ShapeReshapeTallyDepthRavelEnlistTableCatenateReverseRotateTransposeRazeMixSplitEncloseNestCut (K)PairLinkPartitioned EnclosePartition
Selection FirstPickTakeDropUniqueIdentitySelectReplicateExpandSet functions (IntersectionUnionWithout) ∙ Bracket indexingIndex
Selector Index generatorGradeIndex OfInterval IndexIndicesDeal
Computational MatchNot MatchMembershipFindNub SieveEncodeDecodeMatrix InverseMatrix DivideFormatExecuteMaterialiseRange
Primitive operators Monadic EachCommuteConstantReplicateExpandReduceWindowed ReduceScanOuter ProductKeyI-BeamSpawnFunction axis
Dyadic BindCompositions (Compose, Reverse Compose, Beside, Withe, Atop, Over) ∙ Inner ProductPowerAtUnderRankDepthVariantStencilCut (J)
Quad names
Arrays Index originMigration levelAtomic vector
Functions Name classCase convertUnicode convert
Operators SearchReplace